这个题是个高精度题,要求求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 10000
void 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;
}