| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 787 人关注过本帖, 1 人收藏
标题:计算麦森数的高精度乘法运算,求解
只看楼主 加入收藏
wwfdzh2012
Rank: 2
等 级:论坛游民
帖 子:88
专家分:27
注 册:2012-11-22
结帖率:94.12%
收藏(1)
已结贴  问题点数:20 回复次数:4 
计算麦森数的高精度乘法运算,求解
【问题描述】形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:输入P(1000<P<3100000),计算2^P -1的位数和最后500位数字(用十进制高精度数表示)这个程序将大整数表示为10000进制的,具体的不懂。
表示看不懂这个程序,有几个问题:
1.anPow存放的到底是什么?为什么初始化为2而不是1?
2.子函数的计算思路
求大神解析!!
程序代码:
#include<stdio.h>
#include<string.h>
#define LEN 125
#include<math.h>
void Multiply(int *a,int *b)   //此函数的功能是计算高精度乘法a*b,结果的末500位放在a中
{
    int i,j;
    int nCarry;    //存放进位
    int nTmp;       
    int c[LEN];    //存放结果的末500位
    memset(c,0,sizeof(int)*LEN);
    for(i=0;i<LEN;i++)
    {
        nCarry=0;
        for(j=0;j<LEN-i;j++)
        {
            nTmp=c[i+j]+a[j]*b[i]+nCarry;
            c[i+j]=nTmp%10000;
            nCarry=nTmp/10000;
        }
    }
    memcpy(a,c,LEN*sizeof(int));
}
void main()
{
    int i,p;
    int anPow[LEN];  //存放不断增长的2的次幂
    int aResult[LEN];//存放结果的末500位
    scanf("%d",&p);
    printf("%d\n",(int)(p*log10(2))+1);
    anPow[0]=2;
    aResult[0]=1;
    for(i=1;i<LEN;i++)
    {
        anPow[i]=0;
        aResult[i]=0;
    }
    //下面计算2的p次方
    while(p>0)
    {
        if(p&1)
            Multiply(aResult,anPow);
        p>>=1;
        Multiply(anPow,anPow);
    }
    aResult[0]--;  //结果减一
    for(i=LEN-1;i>=0;i--)
    {
        if(i%25==12)
            printf("%02d\n%02d",aResult[i]/100,aResult[i]%100);
        else
        {
            printf("%04d",aResult[i]);
            if(i%25==0)
                printf("\n");
        }
    }
}




[ 本帖最后由 wwfdzh2012 于 2013-4-22 21:43 编辑 ]
搜索更多相关主题的帖子: 十进制 最大的 color 
2013-04-22 20:58
wwfdzh2012
Rank: 2
等 级:论坛游民
帖 子:88
专家分:27
注 册:2012-11-22
收藏
得分:0 
版主大人快出来啦
2013-04-22 21:09
wwfdzh2012
Rank: 2
等 级:论坛游民
帖 子:88
专家分:27
注 册:2012-11-22
收藏
得分:0 
为什么沉了
2013-04-22 21:34
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
麦森,还真不习惯这个叫法。

anPow存的是2的(2的i次方)次方的值。是个中间结果,配合下面用分治法计算2^P的值。

为什么初始化为2而不是1?初始化成1的话它再怎么乘不还是1。

至于乘法运算部分就是简单的手算模拟,没什么可讲的。

自己好好看看吧,哥不是曹操,不能随叫随到。

重剑无锋,大巧不工
2013-04-22 21:37
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
把你那一堆急删了,静神已经不满意了,他才是这里的老大呵呵。

重剑无锋,大巧不工
2013-04-22 21:41
快速回复:计算麦森数的高精度乘法运算,求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022027 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved