Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 11978 | Accepted: 3194 |
Description
Input
Output
Sample Input
143 10 143 20 667 20 667 30 2573 30 2573 40 0 0
Sample Output
GOOD BAD 11 GOOD BAD 23 GOOD BAD 31
Source
给定两个数,一个数S是由两个素数 a,b相乘得到的数,另一个数L随便,问 min(a,b) 是否小于L。
解题思路:素数打表,然后从前往后遍历看S是否能被当前素数整除,如果整除,判断是否小于L。
注意:给定的S是大数,只能用字符数组保存。
一个数a判断能不能整除b,只要判断 a%b是否等于0就可以了。
同余定理:
(a+b)%c=(a%c+b%c)%c;
(a*b)%c=(a%c+b%c)%c;
对大数取余
模板: 大数字符串形式 a[1000];
char a[1000];
int m=0;
for(int i=0;a[i]!=‘\0‘;i++)
m=((m*10)%n+(a[i]-‘0‘)%n)%n;//也可以写成 m=(m*10+a[i]-‘0‘)%n
m为所求的余数
本题大数求余的方法为: 把字符串从后面起 三位三位的保存在一个int类型数组中,比如 12345 存在int类型数组里面为 12 345 然后按照前面的方法求:
bool mod(int n) { int m=0;//气死我了!!!!!! for(int i=0;i<=k-1;i++) m=(m*1000+num[i])%n; if(m==0) return true; return false; }
代码:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; const int maxn=1000005; bool isprime[maxn+1]; int prime[maxn+1]; int primelen=0;//素数表的长度 int slen;//输入大数的长度 char s[10000];int l; int num[600];int k;//转换后的长度 void sieve(int n)//筛法求素数 { for(int i=0;i<=n;i++) isprime[i]=1; isprime[0]=isprime[1]=0; for(int i=2;i<=n;i++) { if(isprime[i]) { prime[primelen++]=i; for(int j=2*i;j<=n;j+=i) isprime[j]=0; } } } void change()//将字符串每三位(从后数)放在int数组中,比如 12345 , 12 345 { k=0; int a=slen/3; int b=slen%3; int temp=0; if(b)//不能被3整除 { for(int i=0;i<b;i++) temp=temp*10+s[i]-'0'; num[k++]=temp; } int cnt=0; for(int i=1;i<=a;i++) { temp=0; int start=b+3*cnt; for(int j=0;j<3;j++) temp=temp*10+s[start+j]-'0'; num[k++]=temp; cnt++; } } bool mod(int n) { int m=0;//气死我了!!!!!! for(int i=0;i<=k-1;i++) m=(m*1000+num[i])%n; if(m==0) return true; return false; } int main() { sieve(maxn); while(cin>>s>>l&&(s[0]!='0'||l!=0)) { slen=strlen(s); change(); bool ok=1; int ans; for(int i=0;i<primelen;i++) { if(mod(prime[i])&&prime[i]<l) { ok=0; ans=prime[i]; break; } if(prime[i]>=l) break; } if(ok) cout<<"GOOD"<<endl; else cout<<"BAD "<<ans<<endl; } return 0; }
[ACM] POJ 2635 The Embarrassed Cryptographer (同余定理,素数打表)
原文地址:http://blog.csdn.net/sr_19930829/article/details/37991865