先找出10^6之内的素数打表,然后用每个数组的一个单位代表1000进制,这种思想是我在学大数除法的时候学到。这里选用一千进制是因为l有10^6,取模如果再乘以下一位数的时候正好最大为10^9不会超int型。
代码:
#include<iostream>
#include<cmath>
#define maxn 1000000
int num[40],s,f[1000005],p[100005],plen,len;
using namespace std;
bool Solve(int i)
{
int cnt=0;
for(int j=0;j<s-1;j++)
cnt=(cnt*1000+num[j])%i; //选用1000进制的原因。
if( len%3==1&&num[s-1]<10&&(cnt*10+num[s-1])%i==0)
return true;
if( len%3==2&&num[s-1]<100&&(cnt*100+num[s-1])%i==0)
return true;
if( len%3==0&&(cnt*1000+num[s-1])%i==0)
return true;
return false;
}
void Prime()
{
memset(f,0,sizeof(f));
plen=0;
for(int i=2;i<=maxn;i++){
if( !f[i]){
p[plen++]=i;
for(int j=i;j<=maxn;j+=i)
f[j]=1;
}
}
}
int main()
{
int sum,l,i,j;
char k[105];
Prime();
while( scanf("%s %d",k,&l)){
if( strcmp(k,"0")==0&&l==0) break;
memset(num,0,sizeof(num));
len=strlen(k);
s=0;
for( i=0;i+3<=len;i+=3){
sum=0;
for( j=0;j<3;j++)
sum=sum*10+k[i+j]-'0';
num[s++]=sum;
}
if( len-i>0){
sum=0;
for( j=i;j<len;j++)
sum=sum*10+k[j]-'0';
num[s++]=sum;
}
bool flag=true;
for( i=0;i<plen&&p[i]<l;i++){
if( Solve(p[i])){
flag=false;
break;
}
}
if( flag) printf("GOOD\n");
else printf("BAD %d\n",p[i]);
}
return 0;
}