题意:给一个大数K,int内的l,K是两个质数的乘积,问这两个质数是否小于有小于l的数;
题解:先打质数的表,再按照大数取模依次对这些质数取模;
大数取模:(
点击打开链接)
例如:如果1234是个大数,求对3取模的结果;
1 % 3 == 1
(1*10 + 2)%3 == 0
(0*10 + 3)%3 == 0
(0*10 + 4)%3 == 1
此题为千进制,原理相同;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char k[105];
int kt[105];
int p[1001000];
int l;
int f[3] = {1,10,100};
int cnt,num;
bool Mod(int p)
{
int tmp = 0;
for(int i = cnt; i >= 0; i--)
tmp = (tmp*1000 + kt[i]) % p;
if(tmp == 0)
return true;
else
return false;
}
void table()
{
num = 0;
p[num++] = 2;
for(int i = 3; i <= 1001000; i += 2)
{
bool flag = 1;
for(int j = 0; p[j]*p[j] <= i; j++)
{
if(!(i%p[j]))
{
flag = 0;
break;
}
}
if(flag)
{
p[num++] = i;
//cout<<i<<endl;
}
}
return;
}
int main()
{
table();
while(cin>>k>>l && l)
{
memset(kt,0,sizeof(kt));
int len = strlen(k);
cnt = 0;
num = 0;
for(int i = len-1; i >= 0; i--)
{
if(num == 3)
{
num = 0;
//cout<<kt[cnt]<<endl;
cnt++;
}
kt[cnt] = kt[cnt] + (k[i]-'0') * f[num];
num++;
}
num = 0;
bool flag = 0;
while(p[num] < l)
{
if(Mod(p[num]))
{
printf("BAD %d\n",p[num]);
flag = 1;
break;
}
num++;
}
if(!flag)
printf("GOOD\n");
}
return 0;
}
#include<cstring>
#include<algorithm>
using namespace std;
char k[105];
int kt[105];
int p[1001000];
int l;
int f[3] = {1,10,100};
int cnt,num;
bool Mod(int p)
{
int tmp = 0;
for(int i = cnt; i >= 0; i--)
tmp = (tmp*1000 + kt[i]) % p;
if(tmp == 0)
return true;
else
return false;
}
void table()
{
num = 0;
p[num++] = 2;
for(int i = 3; i <= 1001000; i += 2)
{
bool flag = 1;
for(int j = 0; p[j]*p[j] <= i; j++)
{
if(!(i%p[j]))
{
flag = 0;
break;
}
}
if(flag)
{
p[num++] = i;
//cout<<i<<endl;
}
}
return;
}
int main()
{
table();
while(cin>>k>>l && l)
{
memset(kt,0,sizeof(kt));
int len = strlen(k);
cnt = 0;
num = 0;
for(int i = len-1; i >= 0; i--)
{
if(num == 3)
{
num = 0;
//cout<<kt[cnt]<<endl;
cnt++;
}
kt[cnt] = kt[cnt] + (k[i]-'0') * f[num];
num++;
}
num = 0;
bool flag = 0;
while(p[num] < l)
{
if(Mod(p[num]))
{
printf("BAD %d\n",p[num]);
flag = 1;
break;
}
num++;
}
if(!flag)
printf("GOOD\n");
}
return 0;
}