poj2635 The Embarrassed Cryptographer

来源:互联网 发布:易语言登录器源码 编辑:程序博客网 时间:2024/06/05 18:44
我的天~~不算难把,但是有个小细节没考虑好WA很久,那就是,如果在100W的质数表内没找到那个数,应该是输出GOOD的,通过Sample才找到问题
大数(十位进制变千位)+同余模定理+质数快速有效打表(奇数平方递推筛)

用了文件输入输出,赞

#include <iostream>#include <string.h>#include <stdlib.h>#include <cstdio>using namespace std;const int N=1010100;int prime[N];int pNum=0;int que=0;void FindPrime(){    prime[pNum++]=2;    for(int i=3;i<=N;i+=2)    {        bool isprime=true;        for(int j=0;prime[j]*prime[j]<=i;j++)        {            if(!(i%prime[j]))            {                isprime=false;                break;            }        }        if(isprime)            prime[pNum++]=i;    }}int getMod(int* K,int modthis,int len){    int tmp=0;    for(int i=len-1;i>=0;i--)    {        tmp=(tmp*1000+K[i])%modthis;    }    return tmp;}void strtointk(char* m,int* K){    int len=strlen(m);    int num=0;    for(int i=len-1;i>=0;)    {        for(int j=i-2>=0?i-2:0;j<=i;j++)        {            num=num*10+m[j]-'0';        }        K[que++]=num;        num=0;        if(i-3>=0)            i-=3;        else            i=-1;    }    return;}int main(){    //freopen("H:\\in.txt","r",stdin);    //freopen("H:\\out.txt","w",stdout);    FindPrime();    char m[11111];    int n;    while(scanf("%s%d",m,&n))    {        que=0;        bool canget=false;        int K[10111];        memset(K,0,sizeof(K));        strtointk(m,K);        if(strcmp(m,"0")==0&&n==0)            break;        for(int i=0;i<pNum&&prime[i]<n;i++)            if(getMod(K,prime[i],que)==0)            {                if(prime[i]<n)                {                    printf("BAD %d\n",prime[i]);                    canget=true;                    break;                }                else                {                    printf("GOOD\n");                    canget=true;                    break;                }            }        if(!canget)        {            printf("GOOD\n");        }    }    //fclose(stdin);    //fclose(stdout);    return 0;}


0 0
原创粉丝点击