洛谷 P1045 麦森数

来源:互联网 发布:js获取input file对象 编辑:程序博客网 时间:2024/06/06 14:21

题目

形如2P-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数,2P-1不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。

任务:从文件中输入P(1000

题解

计算2的p次方,令m=p/2,则有两种情况:如果p是偶数,那么2p=(2m)2,否则有2p=2(2m)2,基于这种思想,则有算法EXPREC的递归算法。
计算完后,输出2p的位数,计算方法
trunc(ln(2)/ln(10)*n)+1
最后输出2p的最后500位

代码

var  n,x,y:longint;  a,b,c:array[1..500*3]of longint;procedure mul;var  i,j,g:longint;begin  for i:=1 to 500 do   begin    g:=0;    for j:=1 to 500 do     begin      c[i+j-1]:=c[i+j-1]+a[i]*a[j]+g;      g:=c[i+j-1] div 10;      c[i+j-1]:=c[i+j-1] mod 10;     end;    c[i+j]:=g;   end;end;procedure mul2;var  s,g,i,j:longint;begin  for i:=1 to 500 do   begin    g:=0;    for j:=1 to 500  do     begin      c[i+j-1]:=c[i+j-1]+a[i]*b[j]+g;      g:=c[i+j-1] div 10;      c[i+j-1]:=c[i+j-1] mod 10;     end;    c[i+j]:=g;   end;end;procedure exprec(m:longint);begin  if m=0 then c[1]:=1  else  begin    exprec(m div 2);    a:=c;    fillchar(c,sizeof(c),0);    if odd(m) then mul2 else mul;  end;end;begin  readln(n);  b[1]:=2;x:=1;  exprec(n);  writeln(trunc(ln(2)/ln(10)*n)+1);  c[1]:=c[1]-1;  for y:=500 downto 1 do    begin      write(c[y]);      if x mod 50=0 then writeln;      inc(x);    end;end.
1 0
原创粉丝点击