题目链接:http://poj.org/problem?id=2635
首先说这道题的思路很简单:
1、素数打表,但是有一个细节,就是对打表后的数组最后的一个数要取一个大于1000000的数,因为在后面进行循环是否素数除尽使得判断条件是小于L,如果打表的数组最后一个数小于L,则循环一直进行下去,就导致了runtime error!!!我就是在这里错了好多次,而且自己检查了好多 遍也没有发现错误,最后看了别人上的博客,一看恍然大悟啊!
2、对k进行处理,因为数太大,读入的时候按照字符串处理,然后换成大进制数组,提高运算效率,可以换成千进制,但是进制也不能过大,因为取余后的数是小于1000000的,要保证原数加上取余后的数没有越界的.
3、最后就是对整个大数取模,就是对换成的高进制取余看是否被整除的!
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int vis[1000005],t;
void fun()
{
t=0;
int i,j;
for(i=1; i<=1000000; i++)
vis[i]=1;
for(i=2; i<=500000; i++)
{
j=i+i;
while(j<=1000000)
{
vis[j]=0;
j+=i;
}
}
t=0;
for(i=2;i<=1000000; i++)
if(vis[i]==1)
{
vis[t++]=i;//储存的是素数的
// printf("%d\n",vis[t-1]);
}
vis[t]=10000000;
//t代表的是1000000中素数的个数
}
int main()
{
char s[105];
int len,i,j,p,k;
int a[40],b[40];
fun();//找到素数
while(1)
{
scanf("%s%d",s,&p);
if(s[0]=='0' && p==0)
break;
len=strlen(s);
for(i=0; i<=39; i++)
a[i]=0;
i=-1;
for(j=len-1; j>=0; j-=3)
{
i++;
for(k=j-2; k<=j; k++)
{
if(k<0)
continue;
a[i]=a[i]*10+s[k]-'0';//分段存储的
}
}
len=i;//又一个长度的
int sign=0;
i=0;
for(i=0; vis[i]<p; i++)
{
for(j=0; j<=len; j++)
b[j]=a[j];
for(j=len; j>0; j--)
b[j-1]+=(b[j]%vis[i])*1000;
if((b[0]%vis[i])==0)
{
sign=1;
break;
}
}
if(sign==1)
printf("BAD %d\n",vis[i]);
else
printf("GOOD\n");
}
return 0;
}