POJ 2706 麦森数 解题报告
POJ 2706 麦森数 解题报告
编号:2706
考查点:高精度计算,大数运算
思路:首先想到的是把乘法化加法,逐步计算后500位,代码很简单,唯一的缺点就是每次提交都是超时,嘿嘿..后来看书竟然发现原来求长度有个很好的方法p*log10(2),系统函数库果真强大。然后就是有一个公式可以把2的p次幂化为二进制求法,如果p的二进制某位为0,自然少了计算过程。
提交情况: 前几天提交一直超时,昨天改变算法在sizeof那遇到点bug,今天修正后得以AC.。
Source Code:
//POJ Grids 2706
#include <math.h>
#include <iostream>
using namespace std;
#define MAX 125
unsigned int num[MAX];
unsigned int key[MAX];
void multiply(unsigned int* num,unsigned int* key)
{
unsigned int temp[MAX];
memset(temp,0,sizeof temp);
for (int i=0;i<MAX;i++)
{
int nCarry = 0;
for (int j=0;j<MAX-i;j++)
{
int nTmp = temp[i+j] + num[j]*key[i] + nCarry;
temp[i+j] = nTmp%10000;
nCarry = nTmp/10000;
}
}
memcpy(num,temp,sizeof(unsigned int)*MAX);
}
int main()
{
int m;
cin>>m;
//use the math.h ,perfect
cout<<(int)(m*log10(2.0F)+1)<<endl;
memset(num,0,sizeof num);
memset(key,0,sizeof key);
num[0] = 1;
key[0] = 2;
while (m>0)
{
if (m&1)
{
multiply(num,key);
}
multiply(key,key);
m >>= 1;
}
num[0]--;
for (int i=MAX-1;i>=0;i--)
{
if (i%25==12)
printf("%02d\n%02d",num[i]/100,num[i]%100);
else
{
printf("%04d",num[i]);
if (i%25==0)
cout<<endl;
}
}
return 0;
}
总结:此题和POJ 1833一样,也是历史遗留题,首先是超时问题,改变算法提交后,又一直得不到正确结果,今天才发现,我在sizeof的使用方法那犯了错误,可笑的是前两天我刚总结过sizeof的一些特性.悲哀啊.。
By Ns517
Time 09.02.03