#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
#define LEN 125 //每数组元素存放十进制的4 位,因此数组最多只要125 个元素即可。
#include <math.h>
/* Multiply 函数功能是计算高精度乘法 a * b结果的末 500 位放在a 中*/
void Multiply(int* a, int* b) {
int i, j;
int nCarry; //存放进位
int nTmp;
int c[LEN*2]; //存放结果的末500 位
memset(c, 0, sizeof(int) * LEN);
for (i=0; i<LEN; i++)
for(j=0;j<LEN;j++){
c[i+j]+=a[i]*b[j];
if(c[i+j]>=10000){//要及时进位,全算完再进位可能会溢出
c[i+j+1]+=c[i+j]/10000;
c[i+j]%=10000;
}
}
memcpy( a, c, LEN*sizeof(int));
}
int main() {
int i;
int p;
int anPow[LEN]= {0}; //存放不断增长的2 的次幂
int aResult[LEN]= {0}; //存放最终结果的末500 位
scanf("%d", &p);
printf("%d\n", (int)(p*log10(2))+1);
//下面将2 的次幂初始化为2^(2^0)(a^b 表示a的b次方),
//最终结果初始化为1
anPow[0]=2;
aResult[0]=1;
//下面计算2的p次方
while (p>0) { // p = 0 则说明p中的有效位都用过了,不需再算下去
if ( p&1 ) //判断此时p 中最低位是否为1
Multiply(aResult, anPow);
p>>=1;
Multiply(anPow, anPow);
}
aResult[0]--; //2的p次方算出后减1
//输出结果
for (i=LEN-1; i>=0; i--) {
if (i%25==12)
printf("%02d\n%02d", aResult[i]/100,aResult[i]%100);
else {
printf("%04d", aResult[i]);
if (i%25==0) printf("\n");
}
}
return 0;
}
POJ麦森数
最新推荐文章于 2020-04-20 17:05:44 发布