您的位置:首页 > 其它

POJ2635-The Embarrassed Cryptographer-大整数素因子

2016-01-29 22:59 369 查看
计算一个大整数(10^100)中有没有一个小于L的素因子。这个大整数是两个素数的乘积。其实就是RSA加密。

做法是把大整数表示成千进位,用数组存储,然后一位一位地取模。

/*--------------------------------------------------------------------------------------*/
//        Helica's header
//        Second Editions
//        2015.11.7
//
#include <algorithm>
#include <iostream>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>

//debug function for a N*M array
#define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
{for(int j=0;j<(M);j++){\
printf("%d",G[i][j]);}printf("\n");}
//debug function for int,float,double,etc.
#define debug_var(X) cout<<#X"="<<X<<endl;
/*--------------------------------------------------------------------------------------*/
using namespace std;

int N,M,T,L;
char save[110];
int num[110];

const int MAXN = 1000100;
int prime[MAXN];

void getPrime()
{
memset(prime,0,sizeof prime);
for(int i=2;i<=MAXN;i++)
{
if(!prime[i]) prime[++prime[0]] = i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i] = 1;
if(i%prime[j] == 0) break;
}
}
}

bool mod(int p,int len)
{
int r = 0;
for(int i=len-1;i>=0;i--)
r = (r*1000 + num[i])%p;

if(!r) return false;
else return true;
}

int main()
{
getPrime();

while(scanf("%s%d",save,&L) && L)
{
int flag = 1;
int len = strlen(save);

memset(num,0,sizeof num);

for(int i=0;i<len;i++)
{
int p = (len+2-i)/3-1;
num[p] = num[p]*10+(save[i]-'0');
}
len = (len+2)/3;

for(int i=1;prime[i]<L;i++)
{
int p = prime[i];
//printf("p=%d\n",p);
if(!mod(p,len))
{
printf("BAD %d\n",p);
flag = false;
break;
}
}
if(flag) printf("GOOD\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: