题目:麦森数

题目描述

形如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     } 
原文地址:https://www.cnblogs.com/noip/p/2633714.html