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("\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"); } }