Description
形如2^P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P(1000<P<3100000),计算2^P-1的位数和最后500位数字(用十进制高精度数表示)
Input
一个整数P(1000
< font="">
Output
第一行:十进制高精度数2^P-1的位数。
第2-11行:十进制高精度数2^P-1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2^P-1与P是否为素数。
Sample Input
1279
Sample Output
386
000000000000000000000000 000000000000000000000000 00
000000000000000000000000 000000000000000000000000 00
000000000000001040793219 466439908192524032736408 55
386152622472667048053191 123504036080596733602980 12
239441732324184842421613 954281007791383566248323 46
490813990660567732076292 412950938922034577318334 96
615835504729594205476898 112116936771475484788669 62
501384438260291732348885 311160828538416585028255 60
466622483189091880184706 822220314052102669843548 87
329580288780508697361869 007147207105557031687290 87
注意:不用换行
解题思路:先读入k,然后根据公式p=trunc(k*(ln(2)/ln(10)))+1,并且先输出p,用一个过程进行高精度乘高精度的快速密计算,最后从500循环到1输出。
程序:
const
maxn=1000;
var
a,b:array[1..maxn] of integer;
p,i,k:longint;
procedure try(n:longint);
var
x,i,j:longint;
begin
if n=0 then exit;
try(n div 2);
if n mod 2=1 then x:=2
else if n mod 2=0 then x:=1;
for i:=1 to 500 do
for j:=1 to 500 do
a[i+j-1]:=a[i+j-1]+b[i]*b[j]*x;
for i:=1 to 500 do
begin
b[i]:=a[i] mod 10;
a[i+1]:=a[i+1]+a[i] div 10;
end;
fillchar(a,sizeof(a),0);
end;
begin
readln(k);
p:=trunc(k*(ln(2)/ln(10)))+1;
writeln(p);
b[1]:=1;
try(k);
b[1]:=b[1]-1;
for i:=500 downto 1 do
write(b[i]);
end.
版权属于:
原文地址:
转载时必须以链接形式注明原始出处及本声明。