麦森数 ------ poj 2706(百练)

麦森数:

形如2p-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数。2p-1不一定也是素数。

 


代码一

 

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define N 126
 6 using namespace std;
 7 int ans[N],anspow[N];
 8 void mult(int ans[],int anspow[])
 9 {
10   int i,j;
11   int c[N];
12   memset(c,0,sizeof(c));
13         for(i=0;i<N;i++)  
14         {  
15             for(j=0;j<N;j++)                  
16             {  
17                 if(i+j<N)//超出500位的部分不计算
18                 {
19                   c[i+j]+=ans[j]*anspow[i]; 
20                 }                              
21             }  
22            for(j=0;j<N-1;j++)  
23            {  
24                 if(c[j]>=10000) 
25                 {  
26                     c[j+1]+=c[j]/10000;//压4位  
27                      c[j]%=10000;              
28                 }                    
29            }  
30         }  
31         memcpy(ans,c,N*sizeof(int));  //复制函数
32 }
33 int main()
34 {
35   int P,i,j;
36   while(cin>>P)
37   {
38     memset(ans,0,sizeof(ans));
39     memset(anspow,0,sizeof(anspow));
40     printf("%d\n",(int)(P*log10(2)+1));
41     ans[0]=1;
42     anspow[0]=2;
43 /************关键部分计算2^P*******
44  2^p=(2^1)*(2^2)*(2^3)*(2^4)*(2^5)………………
45  简单说下:P=5 -----101(二进制)
46     p & 1 =1(最右边一位) -->>>ans=2 anspow=2
47     p>>1=110  anspow=2^2
48     p & 1 =0  此时表明2^3不存在 ans=2 anspow=2^4
49     p>>1=1       
50     p & 1 =1  ------>>>>> ans=2^5 
51     p>>1=0   ------结束    
52 ************************************/
53     while(P)
54     {
55         if( P & 1)
56             mult(ans,anspow);
57         P>>=1;
58             mult(anspow,anspow);
59     }
60     ans[0]--;//2^P的个位为2,4,6,8,故可以-1
61 /****************输出格式的控制************************/
62     for(i=124;i>=0;i--)
63     {
64         if(i%25==12)  
65         {
66            printf("%02d\n%02d",ans[i]/100,ans[i]%100);  
67         }
68         else  
69         {  
70            printf("%04d",ans[i]);
71            if(i%25==0) printf("\n");
72         }     
73     }
74 /***************************************************/
75   }
76 return 0;
77 }

 


代码二

 

 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 }

 

 

 

 

 

 

posted on 2012-07-25 15:38  L_S_X  阅读(1970)  评论(0编辑  收藏  举报

导航