POJ 2706 麦森数 解题报告

POJ 2706 麦森数 解题报告

编号:2706

 

考查点:高精度计算,大数运算

 

思路:首先想到的是把乘法化加法,逐步计算后500位,代码很简单,唯一的缺点就是每次提交都是超时,嘿嘿..后来看书竟然发现原来求长度有个很好的方法p*log10(2),系统函数库果真强大。然后就是有一个公式可以把2p次幂化为二进制求法,如果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

posted @ 2009-02-03 13:30  端木  阅读(1472)  评论(0编辑  收藏  举报