什么叫快速幂算法
题目描述
形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000
#include <stdio.h>
#include <math.h>
int mai[505]={0};
int mi[505]={0};
int z[1001]={0};
int main()
{
int x,y,t,weishu,n;
scanf("%d",&n);
weishu = log10(2)*n+1;//log(n)+1,为n的位数
mai[1] = 1;
mi[1] = 2;
while(n!=0)
{
if(n&1)//当n最低位为1
{
//高精度乘法
t = 0;
for(x=1;x<=500;x++)
{
t = 0;
for(y=1;y<=500;y++)
{
//数组z为中间转换数组
z[x+y-1]=mai[x]*mi[y]+z[x+y-1]+t;
t=z[x+y-1]/10;
z[x+y-1]=z[x+y-1]%10;
}
}
for(x=1;x<=500;x++)
{
mai[x] = z[x];
z[x] = 0;//z数组归零
}
}
n = n>>1;
t = 0;
for (x=1;x<=500;x++)
{
t=0;
for (y=1;y<=500;y++)
{
z[x+y-1]=mi[x]*mi[y]+z[x+y-1]+t;
t=z[x+y-1]/10;
z[x+y-1]=z[x+y-1]%10;
}
}
for(x=1;x<=500;x++)
{
mi[x] = z[x];
z[x] = 0;
}
}
printf("%d\n",weishu);
mai[1]--;
t = 0;
for(x=500;x>=1;x--)
{
t++;
printf("%d",mai[x]);
if(t==50)
{
printf("\n");
t = 0;
}
}
return 0;
}