Localhost8080

知行合一,自强不息

 

麦森数(高精度求 2^p-1的位数以及后500位)

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


#include <cmath>
#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);
//            cout<<'.';
        }

        
else
        
{
            printf(
"%04d",num[i]);
            
if (i%25==0)
            
{
                cout
<<endl;
//                cout<<num[i]<<endl;
            }

        }

    }


    
return 0;
}

posted on 2010-05-19 19:25 superKiki 阅读(770) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿

随笔档案

文章分类

我的好友

一些常去的网站

搜索

最新评论

阅读排行榜

评论排行榜