这个题的大数处理技巧挺值得学习的。
比如说一个数9876543210097,把它转化为本题所说的千进制就是 th[5]=9,th[4]=876,th[3]=543,th[2]=210,th[1]=097;
然后这个数就变成了千进制的th[5] th[4] th[3] th[2] th[1;
大数处理技巧说完了,也就没什么了,还有一个素数表,我相信,你肯定会!
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 1000010
using namespace std;
int L;
char ch[111];
int len,klen;
int th[50];
int u[MAX],su[MAX];
void init() //素数表,su[]记录素数
{
int i,j,num=1;
memset(u,1,sizeof(u));
for(i=2;i<=MAX;i++)
{
if(u[i]) su[num++]=i;
for(j=1;j<num;j++)
{
if(i*su[j]>MAX) break;
u[i*su[j]]=0;
if(i%su[j]==0) break;
}
}
}
void trans() //将大数转化为千进制。
{
int i,j=0;
memset(th,0,sizeof(th));
len=0;
while(ch[j++]) {len++;}
for(i=0;i<len;i++)
{
int k=(len-i+2)/3;
th[k]=th[k]*10+ch[i]-'0';
}
klen=(len+2)/3;
}
int work(int prime) //判断素数是否是该大数的因子
{
int i,j;
int mod=0;
for(i=klen;i;i--)
{
mod=(mod*1000+th[i])%prime;
}
if(mod)
return 0;
else return 1;
}
int main()
{
int i;
init();
while(cin>>ch>>L&&L)
{
int flag=0;
trans();
for(i=1;su[i]<L;i++)
{
flag=work(su[i]);
if(flag)
{
cout<<"BAD "<<su[i]<<endl;
break;
}
}
if(!flag)
cout<<"GOOD"<<endl;
}
return 0;
}