1 //形如2n-1的素数称为麦森数,这时n一定也是个素数。但反过来不一定,即如果n是个素数。2n-1不一定也是素数。
2
3 #include<iostream>
4 #include<cmath>
5 #include<cstdio>
6 #include<cstring>
7 #define N 126
8 using namespace std;
9 int ans[N],anspow[N];
10 void mult(int ans[],int anspow[])
11 {
12 int i,j;
13 int c[N];
14 memset(c,0,sizeof(c));
15 for(i=0;i<N;i++)
16 {
17 for(j=0;j<N;j++)
18 {
19 if(i+j<N)//超出500位的部分不计算
20 {
21 c[i+j]+=ans[j]*anspow[i];
22 }
23 }
24 for(j=0;j<N-1;j++)
25 {
26 if(c[j]>=10000)
27 {
28 c[j+1]+=c[j]/10000;//压4位
29 c[j]%=10000;
30 }
31 }
32 }
33 memcpy(ans,c,N*sizeof(int)); //复制函数
34 }
35 int main()
36 {
37 int P,i,j;
38 while(cin>>P)
39 {
40 memset(ans,0,sizeof(ans));
41 memset(anspow,0,sizeof(anspow));
42 printf("%d\n",(int)(P*log10(2)+1));
43 ans[0]=1;
44 anspow[0]=2;
45 /************关键部分计算2^P*******
46 2^p=(2^1)*(2^2)*(2^3)*(2^4)*(2^5)………………
47 简单说下:P=5 -----101(二进制)
48 p & 1 =1(最右边一位) -->>>ans=2 anspow=2
49 p>>1=110 anspow=2^2
50 p & 1 =0 此时表明2^3不存在 ans=2 anspow=2^4
51 p>>1=1
52 p & 1 =1 ------>>>>> ans=2^5
53 p>>1=0 ------结束
54 ************************************/
55 while(P)
56 {
57 if( P & 1)
58 mult(ans,anspow);
59 P>>=1;
60 mult(anspow,anspow);
61 }
62 ans[0]--;//2^P的个位为2,4,6,8,故可以-1
63 /****************输出格式的控制************************/
64 for(i=124;i>=0;i--)
65 {
66 if(i%25==12)
67 {
68 printf("%02d\n%02d",ans[i]/100,ans[i]%100);
69 }
70 else
71 {
72 printf("%04d",ans[i]);
73 if(i%25==0) printf("\n");
74 }
75 }
76 /***************************************************/
77 }
78 return 0;
79 }
1 /*************麦森数****************/
2 #include<iostream>
3 #include<cstdio>
4 #include<cmath>
5 #define N 100 //压5位
6 using namespace std;
7 int ans[N];
8 void mult(int t)
9 {
10 int i,temp,last=0;
11 for ( i=N-1; i>=0; i--)
12 {
13 temp=(ans[i]<<t)+last; //乘2^t,加进位
14 last=temp/100000;
15 ans[i]=temp-last*100000; //temp%100000
16 }
17 }
18 void output()
19 {
20 int i;
21 for(i=1;i<=N;i++)
22 { printf("%05d",ans[i-1]);
23 if (i%10==0)cout<<endl;
24 }
25 }
26 int main()
27 {
28 int P,times;
29 while(cin>>P)
30 {
31 memset(ans,0,sizeof(ans));
32 ans[N-1]=1;
33 cout<<(int)(P*log10(2)+1)<<endl;
34 /***********************关键部分*****************
35 2^P=2^(14*times)*2^(P%14) 用移位
36 之所以取14的原因 2^14*(99999)=1.638382*10^9 在(int)
37 范围,15以后都会超int,主要体现在mult()中
38 **********************************************/
39 times=P/14; //只能到14 15以后压缩时会超范围
40 while(times--)
41 mult(14);
42 mult(P%14);
43 --ans[99];
44 output();
45 }
46 return 0;
47 }