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

计算一个大整数(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("
");for(int i=0;i<(N);i++)
{for(int j=0;j<(M);j++){
printf("%d",G[i][j]);}printf("
");}                
//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
",p);
            if(!mod(p,len))
            {
                printf("BAD %d
",p);
                flag = false;
                break;
            }
        }
        if(flag) printf("GOOD
");
    }
}
原文地址:https://www.cnblogs.com/helica/p/5170265.html