回 帖 发 新 帖 刷新版面

主题:麦森数

描述 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.


回复列表 (共1个回复)

沙发

这里是我的:(已AC)
program gaojingdu2ncf(input,output);
const m=500;
var a:array [1..m] of integer;
    f,i,j,c,n,k:longint;
    y:string;
begin
  readln(n);
  f:=trunc(n*ln(2)/ln(10))+1;
  a[1]:=1;
  k:=0;
  str(power(2,29),y);
  for i:=length(y) downto 1 do
  begin
    k:=k+1;
    a[k]:=ord(y[i])-48;
  end;
  c:=0;
  for j:=1 to n-29 do
    for i:=1 to f do
    begin
      if i>500 then continue;
      a[i]:=a[i]*2+c;
      c:=a[i] div 10;
      a[i]:=a[i] mod 10;
    end;
  writeln(f);
  a[1]:=a[1]-1;
  if f<=500 then
  begin
    j:=(500-f) mod 50;
    for i:=1 to (500-f) do
    begin
      write('0');
      if i mod 50=0 then writeln;
    end;
    for i:=f downto 1 do
    begin
      write(a[i]);
      j:=j+1;
      if j mod 50=0 then writeln;
    end;
  end
              else
  for i:=500 downto 1 do
  begin
    write(a[i]);
    if i mod 50=0 then writeln;
  end;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册