题目描述
形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示)
输入格式
文件中只包含一个整数P(1000<P<3100000)
输出格式
第一行:十进制高精度数2^P-1的位数。
第2-11行:十进制高精度数2^P-1的最后500位数字。(一行输出,不足500位时高位补0)
不必验证2^P-1与P是否为素数。
很好的一道高精度题目,花了很长时间去做这道题,因为期间我认为既然要求数的位数,必然要把它全部模拟出来,所以数据一大我的程序就爆栈了,苦恼了很长时间。
原来有这样一个函数可以直接调用 log10(x);强大啊。
而且写高精度的时候,c[i+j]+=a[i]*b[j];这段经常写错,要不掉了+号,要不没考虑数组的边界。
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 5 int p; 6 7 void Dfs(int c[],int x){ 8 if(x==1) {c[0]=2;return ;} 9 if(x==2) {c[0]=4;return ;} 10 11 int i,j,a[601]={0},b[601]={0}; 12 13 Dfs(a,x/2); 14 15 for(i=0;i<600;++i) 16 b[i]=a[i]; 17 if(x&1==1) 18 for(i=0;i<600;++i) 19 b[i]*=2; 20 for(i=0;i<600;++i) 21 if(b[i]>=10) {b[i+1]+=b[i]/10;b[i]%=10;} 22 23 memset(c,0,sizeof(c)); 24 for(i=0;i<600;++i) 25 for(j=0;j<600-i;++j) 26 { 27 c[i+j]+=a[i]*b[j]; 28 if(c[i+j]>=10) 29 { 30 c[i+j+1]+=c[i+j]/10; 31 c[i+j]%=10; 32 } 33 } 34 } 35 36 int main() 37 { 38 cin>>p; 39 cout<<int(log10(2)*p)+1<<endl; 40 41 int c[601]={0},i,j; 42 Dfs(c,p); 43 44 i=0; 45 while(c[i]==0) i++; 46 for(j=0;j<i;++j) c[j]=9; 47 c[i]--; 48 49 for(i=499;i>=0;--i) cout<<c[i]; 50 cout<<endl; 51 return 0; 52 53 }