加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

麦森数--大数乘法

发布时间:2020-12-14 03:56:50 所属栏目:大数据 来源:网络整理
导读:麦森数: 形如2 p -1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数。2 p -1不一定也是素数。 1 #includeiostream 2 #includecmath 3 #includecstdio 4 #includecstring 5 #define N 126 6 using namespace std; 7 int ans[N],ans

麦森数:

形如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,255)">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            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,128)">36   while(cin>>P)
37   {
38     memset(ans,255)">sizeof(ans));
39     memset(anspow,255)">sizeof(anspow));
40     printf("%dn",(int)(P*log10(2)+1));
41     ans[0]=1;
42     anspow[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>>=58             mult(anspow,128)">59     }
60     ans[0]--;2^P的个位为2,4,6,8,故可以-1
61 ***************输出格式的控制***********************62     124;i>=0;i--)
63     {
64         if(i%25==12)  
65         {
66            printf(%02dn%02d100,ans[i]%100);  
67         }
68         else  
69         {  
70            printf(%04d71            0) printf(n");
72         }     
73     }
74 *************************************************75   }
76 return 0;
77 }

关于求解 2^p 部分的解释:


?将p转化为二进制01码, 即形如(a*2^1+b*2^2+c*2^3....) (a,b,c =0,1)


以p=5 举例: p=101; ?即 阶乘1,2,3的系数分别为1,1;


将p与1进行&运算 ,当结果为1时,p最右端的阶乘级系数为1;


即 ?101&1=1 ?-> ? a=1;


101>>1 = 10,10&1=0; ?b->0;


10>>1=1; 1&1=1 ; c->=1;


所以2^p= 2^1 * 2^ 2^2;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读