主题:麦森数
描述 Description
形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示)
输入格式 Input Format
文件中只包含一个整数P(1000<P<3100000)
输出格式 Output Format
第一行:十进制高精度数2^P-1的位数。
第2-11行:十进制高精度数2^P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2^P-1与P是否为素数。
帮忙看看我的程序哪里错了,谢谢了。
var p, i, j, m, n, len, z, l, y : longint;
a, b, c, ans : array[1..502]of integer;
x : array[0..500]of integer;
procedure WeiShu;
begin
readln(p);
len:=trunc((p*ln (2))/ln(10))+1;
i:=0; dec(p);
while p>0 do
begin
x[i]:=p mod 2;
p:=p div 2;
inc(i);
end;
z:=i-1;
end;
procedure FanFuPingFang;
begin
fillchar(c,sizeof(c),0);
for i:=1 to l do
for j:=1 to l do
if i+j-1<=501
then
begin
c[i+j-1]:=c[i+j-1]+a[i]*a[j];
c[i+j]:=c[i+j]+c[i+j-1] div 10;
c[i+j-1]:=c[i+j-1] mod 10;
end;
if i+j>501 then l:=501
else l:=i+j;
while c[l]=0 do dec(l);
for i:=1 to l do a[i]:=c[i];
end;
procedure Chen;
begin
fillchar(b,sizeof(b),0);
for m:=1 to l do
for n:=1 to l do
if m+n-1<=501
then
begin
b[m+n-1]:=b[m+n-1]+a[m]*ans[n];
b[m+n]:=b[m+n]+b[m+n-1] div 10;
b[m+n-1]:=b[m+n-1] mod 10;
end;
if m+n>501 then l:=501
else l:=m+n;
while b[l]=0 do dec(l);
for m:=1 to l do ans[m]:=b[m];
end;
procedure work;
begin
ans[1]:=1; a[1]:=2; l:=1;
for y:=0 to z do
begin
if x[y]=1 then Chen;
FanFuPingFang
end;
end;
procedure print;
begin
assign(output,'1223.out');
rewrite(output);
writeln(len);
for i:=10 downto 1 do
begin
for j:=50 downto 1 do
write(ans[(i-1)*50+j]);
writeln;
end;
close(output);
end;
begin
WeiShu;
work;
print;
end.
形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示)
输入格式 Input Format
文件中只包含一个整数P(1000<P<3100000)
输出格式 Output Format
第一行:十进制高精度数2^P-1的位数。
第2-11行:十进制高精度数2^P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2^P-1与P是否为素数。
帮忙看看我的程序哪里错了,谢谢了。
var p, i, j, m, n, len, z, l, y : longint;
a, b, c, ans : array[1..502]of integer;
x : array[0..500]of integer;
procedure WeiShu;
begin
readln(p);
len:=trunc((p*ln (2))/ln(10))+1;
i:=0; dec(p);
while p>0 do
begin
x[i]:=p mod 2;
p:=p div 2;
inc(i);
end;
z:=i-1;
end;
procedure FanFuPingFang;
begin
fillchar(c,sizeof(c),0);
for i:=1 to l do
for j:=1 to l do
if i+j-1<=501
then
begin
c[i+j-1]:=c[i+j-1]+a[i]*a[j];
c[i+j]:=c[i+j]+c[i+j-1] div 10;
c[i+j-1]:=c[i+j-1] mod 10;
end;
if i+j>501 then l:=501
else l:=i+j;
while c[l]=0 do dec(l);
for i:=1 to l do a[i]:=c[i];
end;
procedure Chen;
begin
fillchar(b,sizeof(b),0);
for m:=1 to l do
for n:=1 to l do
if m+n-1<=501
then
begin
b[m+n-1]:=b[m+n-1]+a[m]*ans[n];
b[m+n]:=b[m+n]+b[m+n-1] div 10;
b[m+n-1]:=b[m+n-1] mod 10;
end;
if m+n>501 then l:=501
else l:=m+n;
while b[l]=0 do dec(l);
for m:=1 to l do ans[m]:=b[m];
end;
procedure work;
begin
ans[1]:=1; a[1]:=2; l:=1;
for y:=0 to z do
begin
if x[y]=1 then Chen;
FanFuPingFang
end;
end;
procedure print;
begin
assign(output,'1223.out');
rewrite(output);
writeln(len);
for i:=10 downto 1 do
begin
for j:=50 downto 1 do
write(ans[(i-1)*50+j]);
writeln;
end;
close(output);
end;
begin
WeiShu;
work;
print;
end.