NSU-1241-麦森数

来源:互联网 发布:红包修改金额软件 编辑:程序博客网 时间:2024/05/14 15:02

这个题是个高精度题,要求求2的k次方-1的后500位,不足的用0补,另外还要求计算2的k次方-1的位数。

首先求位数可用公式进行计算,公式为n=k*log(10)2.0+1;

然后写个高精度计算即可,最后只是需要注意换行的问题。

这里分2种情况进行换行:

1、当i%25==0的时候刚好是100位,因为每个数组我们存的4位。

2、当i%25==12的时候,由1我们知道对于100的情况我们已经处理过,剩下的就只有当50*n(当n为奇数的情况需要处理),我们可以知道50%4=2,150%4=2,都以2作为余数,所以这里我们需要进行一个人为的分割操作,而我们知道为奇数的时候它最后2位总是48,所以我们可以将公式转换为4*i%50==48,这样就比较明显的得到当n为奇数的情况

代码:

#include<cstdio>#include<cstring>#include<cmath>#define Mod 10000void mult(int a[],int b[]){    int c[126];    memset(c,0,sizeof(c));    for(int i=0;i<125;i++)    {int arry=0;for(int j=0;j<125-i;j++){    int ita=c[i+j]+a[i]*b[j]+arry;    arry=ita/Mod;    c[i+j]=ita%Mod;}    }    memcpy(a,c,125*sizeof(int));}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {int ans=(int)n*log10(2.0)+1;printf("%d\n",ans);int a[126],b[126];memset(a,0,sizeof(a));memset(b,0,sizeof(b));a[0]=1;b[0]=2;while(n){    if(n&1)mult(a,b);    mult(b,b);    n>>=1;}a[0]--;for(int i=124;i>=0;i--){    if(i%25==12)printf("%02d\n%02d",a[i]/100,a[i]%100);    else    {printf("%04d",a[i]);if(i%25==0)    printf("\n");    }}    }    return 0;}