android 沉浸式状态栏:NOIP2003-4

来源:百度文库 编辑:高校问答 时间:2024/04/27 21:55:13
noip2003第四题
题四、麦森数(Mason.pas)

【问题描述】形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,

2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。

麦森数有许多重要应用,它与完全数密切相关。

任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)

【输入格式】

文件中只包含一个整数P(1000<P<3100000)

【输出格式】

第一行:十进制高精度数2P-1的位数。

第2-11行:十进制高精度数2P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)

不必验证2P-1与P是否为素数。

【输入样例】
1279

【输出样例】
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087

-------------------------------------------------------------------
我的作法错在哪里???
program mason;
var
f1,f2:text;
i,j:integer;
n,temp:longint;
m:array[1..501] of integer;
begin
assign(f1,'mason.in1');assign(f2,'mason.out');reset(f1);rewrite(f2);
read(f1,n);
temp:=trunc((n*ln(2))/ln(10)+1);writeln(f2,temp);
fillchar(m,sizeof(m),0);m[1]:=1;
for i:=1 to n do for j:=1 to 500 do if m[j]<>0 then begin
m[j]:=m[j]*2;
while m[j]>10 do begin m[j+1]:=m[j+1]+(m[j] div 10);
m[j]:=m[j] mod 10;
m[501]:=0;
end;
end;
for i:=1 to 500 do write(f2,m[i]);
close(f1);close(f2);
end.

m定义为integer型数组
而执行for i:=1 to n do for j:=1 to 500 do if m[j]<>0 then begin
m[j]:=m[j]*2;时大于32768,
m数组的范围超过integer
所以出错.