sicily 1231 The Embarrassed Cryptography

其实就是给出一个数k,和一个上界L,找到小于这个上界L的最小的可以被k整除的数!

问题在于大数k,同样只能用高精度来解决了,取模的时候从最高为开始模,然后把余数给下一位加上,再取模!

而这里还用到了压缩的方法,每三个数字作为一个数储存,然后取模的时候也是一样,加余数的时候乘个1000就行了!

 1 //sicily 1231 The Embarrassed Cryptography
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <cstring>
 6 
 7 using namespace std;
 8 
 9 const int N = 1000000;
10 bool a[N+1];
11 char k[105];
12 int hp[40];
13 int thousand[]={1,10,100,1000};
14 int len;
15 
16 //求素数(筛选法) 
17 void get_prime()
18 {
19     memset(a,1,sizeof(a));
20     for(int i=2; i<=N; i++)
21     {
22         if(a[i])
23         {
24             for(int j=2; j*i<=N; j++)
25                 a[i*j]=0;
26         }
27     }
28 } 
29 //高精度,三位三位的分 
30 void high_precision()  
31 {  
32     memset(hp, 0, sizeof(hp));  
33     len=(strlen(k)-1)/3;  //注意偶数的时候 
34     int klen=strlen(k);  
35     for (int i=0; i<=len; i++)  
36     {  
37         for (int j=1; j<=3 && klen-i*3-j>=0; j++)   
38             hp[i]+=thousand[j-1]*(k[klen-i*3-j]-'0');   
39     }
40     //for(int i=0; i<=len; i++)
41     //    cout << hp[i] << " ";
42     //cout << endl;
43 }  
44 //高精度取模 
45 int is_mod(int x)
46 {
47     int c=0;
48     for(int i=len; i>=0; i--)
49         c=(hp[i]+c*1000)%x;
50     return c;
51 }
52 
53 
54 int main()
55 {
56     int l;
57     get_prime();
58     while(scanf("%s%d", k, &l) && strcmp(k,"0") && l)
59     {
60         high_precision();
61         int ans=0, flag=1;        
62         
63         for(int i=2; i<l; i++)
64         {
65             if(a[i] && is_mod(i) == 0)
66             {
67                 flag=0;
68                 ans=i;
69                 break;
70             }
71         }
72         if(flag)
73             printf("GOOD\n");
74         else
75             printf("BAD %d\n", ans);
76     }
77     return 0;
78 }

 

转载于:https://www.cnblogs.com/dominjune/p/4548149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值