P1045 麦森数

来源:互联网 发布:ug零件产品编程教程 编辑:程序博客网 时间:2024/06/13 09:11

题目描述

形如的素数称为麦森数,这时一定也是个素数。但反过来不一定,即如果是个素数,不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是,它有909526位。麦森数有许多重要应用,它与完全数密切相关。

任务:从文件中输入(),计算的位数和最后500位数字(用十进制高精度数表示)
输入输出格式
输入格式:

文件中只包含一个整数()

输出格式:

第一行:十进制高精度数的位数。

第2-11行:十进制高精度数的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)

不必验证与是否为素数。

输入输出样例
输入样例#1:

1279

输出样例#1:

386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087


高精度乘法问题不大,只要加个快速幂,然后平常写的熟练就行。但是前面的2p1的位数对我来说算是比较难的了……一开始我用Python算了2的0-30的幂,以为自己找到了一点规律……然后自信慢慢地交了上去,发现全WA就很痛苦……果然数学还是很重要的…… 原来这个位数用log就很好求解……因为lgN表示N的位数然后lg2P=Plg2,由于2的幂有一个特性就是尾数只可能为2,4,6,8所以麦森数要求的减一就不影响位数了……果然数学还是要加强啊……
以下是代码(自己写了一个高精类)

#include <bits/stdc++.h>#pragma GCC optimize(2)using namespace std;struct Bigint{    static const int maxn=1001;    short int s[maxn];    int sz;    Bigint(){sz=1;memset(s,0,sizeof(s));}    Bigint operator =(const int &num){        int x=num;        sz=0;        do{            s[sz++]=x%10;            x/=10;        }while(x>0);        return *this;    }    Bigint operator +(Bigint &b){        Bigint c;        c.sz=max(sz,b.sz);        c.sz=min(c.sz,501);        sz=min(sz,501);        b.sz=min(b.sz,501);        for(int i=0;i<c.sz;i++){            c.s[i]+=s[i]+b.s[i];            c.s[i+1]+=c.s[i]/10;            c.s[i]%=10;        }        if(c.s[c.sz])c.sz++;        c.sz=min(c.sz,501);        return c;    }    Bigint operator *(Bigint &b){        Bigint c;        c.sz=sz+b.sz-1;        c.sz=min(c.sz,501);        sz=min(sz,501);        b.sz=min(b.sz,501);        for(int i=0;i<sz;i++)         for(int j=0;j<b.sz;j++){            c.s[i+j]+=s[i]*b.s[j];            c.s[i+j+1]+=c.s[i+j]/10;            c.s[i+j]%=10;         }        if(c.s[c.sz])c.sz++;        c.sz=min(c.sz,501);        return c;    }};ostream& operator <<(ostream& out,const Bigint &x){    for(int i=499,j=0;i>=1;i--,j++){        if(j==50)out<<'\n',j=0;        out<<(char)(x.s[i]+'0');    }    out<<(char)(x.s[0]-1+'0');    return out;}int n;Bigint num,ans,t;void spow(){    Bigint res,x;    res=1,x=2;    while(n>0){        if(n&1)res=res*x;        x=x*x;        n>>=1;    }    cout<<res<<endl;}int main(){    cin>>n;    cout<<(int)(log(2)/log(10)*n+1)<<endl;    spow();    return 0;}
原创粉丝点击