数据因为很大 达到 max=1e9
首先 素数筛选出 sqrt(max)的范围内有多少素数
然后 对于每个n 求出它的所有因子 sort一遍后 从小到大开始遍历过去
特判下 对于n大于 sqrt(max)的情况下 是否为素数的情况 因为N>1e6的情况不超过100组 所以不会特判很多次的
1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int size = 100000; 8 bool vis[size+10]; 9 vector<int>ve; 10 11 void init( ) 12 { 13 memset( vis , true , sizeof(vis) ); 14 vis[0] = vis[1] = false; 15 for( int i = 2 ; i<=size ; i++ ) 16 { 17 if( vis[i] ) 18 { 19 int j = i * 2; 20 while( j<=size ) 21 { 22 vis[j] = false; 23 j += i; 24 } 25 } 26 } 27 } 28 29 void solve( int n ) 30 { 31 ve.clear(); 32 for( int i = 1 ; i*i<=n ; i++ ) 33 { 34 if( n%i==0 ) 35 { 36 ve.push_back( i ); 37 if( i*i!=n ) 38 ve.push_back( n/i ); 39 } 40 } 41 sort( ve.begin() , ve.end() ); 42 } 43 44 bool judge( int x ) 45 { 46 if( x%2==0 ) 47 return false; 48 for( int i = 3 ; i*i<=x ; i+=2 ) 49 { 50 if( x%i==0 ) 51 return false; 52 } 53 return true; 54 } 55 56 int main() 57 { 58 int n , ans , cnt; 59 bool flag; 60 init( ); 61 while( ~scanf("%d",&n) ) 62 { 63 solve( n ); 64 cnt = ve.size(); 65 ans = 0; 66 flag = false; 67 for( int i = 0 ; i<cnt ; i++ ) 68 { 69 if( n/ve[i]>size ) 70 { 71 flag = judge( n/ve[i] ); 72 if( flag ) 73 { 74 ans = ve[i]; 75 break; 76 } 77 } 78 else if( vis[ n/ve[i] ] ) 79 { 80 ans = ve[i]; 81 break; 82 } 83 } 84 printf( "%d ",ans ); 85 } 86 return 0; 87 }