题目:http://poj.org/problem?id=2635
大致题意:
给定一个大数K,K是两个大素数的乘积的值。
再给定一个int内的数L
问这两个大素数中最小的一个是否小于L,如果小于则输出这个素数。
思路:高精度+素数打表+同余模定理

1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 int sushu[100000]; 7 int num[100]; 8 int pNum; 9 void init () 10 { 11 pNum=0; 12 sushu[pNum++]=2; 13 for(int i=3;i<=1100000;i+=2) //奇偶法 14 { 15 bool flag=true; 16 for(int j=0;sushu[j]*sushu[j]<=i;j++) //根号法+递归法 17 if(!(i%sushu[j])) 18 { 19 flag=false; 20 break; 21 } 22 if(flag) 23 sushu[pNum++]=i; 24 } 25 return; 26 } 27 int main() 28 { 29 init(); 30 char str[110]; 31 int k; 32 while(scanf("%s %d%*c",str,&k)!=EOF) 33 { 34 if(str[0]=='0'&&k==0) 35 break; 36 int len,i,j; 37 len=strlen(str); 38 __int64 s=0; 39 int t=0; 40 for(i=0;i<100;i++) 41 num[i]=0; 42 for(i=0;i<len%4;i++) 43 { 44 s=s*10+str[i]-'0'; 45 } 46 num[0]=s; 47 s=0; 48 j=1; 49 for(;i<len;i++) 50 { 51 s=s*10+str[i]-'0'; 52 t++; 53 if(t%4==0) 54 { 55 num[j]=s; 56 j++; 57 s=0; 58 } 59 } 60 if(s!=0) 61 num[j++]=s; 62 int flag=0; 63 for(i=0;i<pNum;i++) 64 { 65 if(sushu[i]>k) 66 break; 67 s=num[0]%sushu[i]; 68 for(t=1;t<j;t++) 69 { 70 s=(s*10000+num[t])%sushu[i]; 71 } 72 if(s==0) 73 { 74 flag=1; 75 break; 76 } 77 } 78 if(flag==0||(sushu[i]==k&&flag==1)) 79 printf("GOOD\n"); 80 else if(flag==1) 81 { 82 printf("BAD "); 83 printf("%d\n",sushu[i]); 84 } 85 } 86 return 0; 87 }