POJ 2635 The Embarrassed Cryptographer

            先找出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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值