麦森数(转)

 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  }

 

posted @ 2012-08-22 14:29  疼痛落在指尖  阅读(199)  评论(0编辑  收藏  举报