poj 2635 The Embarrassed Cryptographer
恩,这题做的郁闷,其实就是一道素数筛选加上大数拆分的题,但做的我万分无奈,提交几次都是RE,但把几个关键数组开大了,还是不行,看看网上的解题报告思路没错啊,最后的最后终于找出来了,原来是筛选素数的数组开小了,==!以后一定要细心啊!!
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxx 1000010//这里开小了~~ int p[80000]; int a[maxx+10]; int num; int s[100]; void init() { int i,j; memset(a,0,sizeof(a)); for(i=2;i*i<=maxx;i++) { if(!a[i]) { for(j=i<<1;j<=maxx;j+=i) a[j]=1; } } j=0; for(i=2;i<=maxx;i++) if(!a[i]) p[j++]=i; } int sub(int x) { int i; __int64 tem=0; for(i=num;i>=0;i--) tem=(tem * 10000000 + s[i])%x; return (int)tem; } int main() { int k,i,j; char str[120]; init(); while(scanf("%s%d",str,&k) ,k) { int len = strlen(str); //if(k==0 && len==1 &&str[0] == '0') //break; num=0; memset(s,0,sizeof(s)); for(i=len-1,j = 1;i >= 0;i--,j *= 10) { if(j==10000000) { j=1;num++; } s[num]+=(str[i]-'0')*j; } int flag=0; for(i=0;p[i]<k;i++) if(sub(p[i])==0) { flag=1;break; } if(flag) printf("BAD %d\n",p[i]); else printf("GOOD\n"); } return 0; }