POJ 2635 N进制大数与小数取模
2011-12-24 18:25
344 查看
先把素数打表,然后进行大数取模,要取N进制(最好5<=N<=10)进行大数取模运算,否则超时(1000000内的素数个数达78498个)
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; #define MLEN 10//每位存pow(10,MELN)进制(即每个位存放MLEN位数) #define MAXN 1000000 bool prime[MAXN + 10] = {1,1,0}; int mymap[MAXN + 10]; int NumPrime[MAXN + 10]; void ComputePrime() { int i,j,sub; sub = -1; for(i = 2;i<=MAXN;i++) { mymap[i] = sub; if(prime[i] == 0) { sub++; NumPrime[sub] = i; mymap[i] = sub; for(j = i + i;j <= MAXN;j += i) { prime[j] = 1; } } } sub++; }//打素数表 bool divide(long long numd[],int n,long long numb,int len)//numd是一个pow(10,10)进制的数。并且由高位到低位排,即与输入相反 { int i; long long carry; long long num = pow(10,MLEN); for(i = n-1;i >= 0;i--) { carry = numd[i] % numb; if(i == 1&&len % MLEN !=0) { num = len % MLEN; num = pow(10,num); } numd[i - 1] = carry * num + numd[i -1]; } if(carry == 0) { return true; } return false; }//大数与小数取模 int main() { char numa[110]; long long numc[110]; long long numd[110]; long long nume[110]; int numb; int len; int i; int t; int temp; int sub; int j; ComputePrime(); while(scanf("%s %d",numa,&numb) != EOF) { if(strcmp(numa,"0")==0 && numb == 0) { break; } memset(numc,0,sizeof(numc)); len = strlen(numa); sub = 0; for(i = 0;i < len;i++) { t = MLEN; temp = MLEN; if(len - i < temp) { temp = len - i; } temp--; while(t--&&i<len) { numc[sub] += pow(10,temp) * (numa[i] - '0'); temp--; i++; } i--; sub++; } temp = sub - 1; for(i = 0;i < sub;i++) { numd[i] = numc[temp--]; }//倒序过来,由大到小排 int i = -1; i = mymap[numb]; if(NumPrime[i] == numb) { i--; } int ans = -1; j = i; i = 0; while(i<=j) { memcpy(nume,numd,sizeof(numd)); if(divide(numd,sub,NumPrime[i],len)) { ans= NumPrime[i]; break; } memcpy(numd,nume,sizeof(numd)); i++; } if(ans == -1 ) { printf("GOOD\n"); } else { printf("BAD %d\n",ans); } } return 0; }
相关文章推荐
- poj 2635(The Embarrassed Cryptographer(把…译成密码) 素数打表的最优方法+10进制转换成1000进制,大数取模
- poj 2305(指定进制,大数取模)
- POJ 1220 (两种任意进制之间的转换(大数),java的BigInteger)
- POJ1001 且适合带小数点大数的幂(R^N)
- POJ PKU 2305 java大数进制转化 JAVA 大数转换成字符串 转
- (大数取模)POJ2635-The Embarrassed Cryptographer
- [转]POJ 1001 Exponentiation Java大数处理高精度小数
- POJ 1131 Octal Fractions 任意进制之间小数的转换
- poj(2635 大数取模)
- POJ 2635 The Embarrassed Cryptographer【数论,千进制,高精度求模+同余模定理】
- POJ 2109 Power of Cryptography二分+大数相乘和pow为什么可以直接过的原因
- poj 1503 大数...java真强大...
- POJ 1625 AC自动机+大数+字符编码
- (大数乘小数、大数加小数、大数相乘、大数阶乘、大数进制转换)
- POJ1503 UVA424 UVALive5399 Integer Inquiry【大数】
- POJ 1503 Integer Inquiry【大数相加 java】
- POJ 2635 The Embarrassed Cryptographer
- uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401
- POJ-2761-树状数组+第k小数+离散化
- The Embarrassed Cryptographer POJ 2635 数论之高精度求模(同余模定理+千进制)