回 帖 发 新 帖 刷新版面

主题:难题求助

求1*2*3..n。
下面程序错在哪里?
var n,i,lc,j,k,x,w:longint;
b,c,d:string;
a:array[1..100000] of longint;
begin
  readln(n);
  b:='1';
  for i:=1 to n do
    begin
    str(i,c);
    lc:=length(c)+length(b);
    for j:=1 to length(b) do
      begin
      for k:=1 to length(c) do
        begin
        x:=b[j]*c[k];
        w:=j+k-1;
        a[w]:=a[w]+x mod 10;
        a[w+1]:=a[w+1]+a[w]\10+x\10;
        a[w]:=a[w] mod 10;
        end;
      end;
    b:='';
    while (a[lc]=0) and (lc>1) do
    lc:=lc-1;
    for j:=1 to lc do
      begin
      str(a[j],d);
      b:=b+d;
      end;
    end;
end.

回复列表 (共5个回复)

沙发

1. Pascal中求整除商使用div如“a div b”而不是“a\b”(这点上来看你是不是学BASIC的)
2. Pascal中字符类型不能直接做加法运算,应该用(ord(c)-48)换成整型。
3. 你的程序没有输出。
4. 你能否解释一下每个变量的意义。

板凳

谢谢,我是小学四年级学生,刚从QuickBasic语言转到Pascal,这是我第一次发帖,以后多向版主请教。

3 楼

如下程序错在哪里?
var n,i,lc,j,k,x,w:longint;
b,c:string;
a:array[1..100000] of longint;
begin
  readln(n);
  b:='1';
  for i:=1 to n do
    begin
    str(i,c);
    lc:=length(c)+length(b);
    for j:=1 to length(b) do
      begin
      for k:=1 to length(c) do
        begin
        x:=b[j]*c[k];
        w:=j+k-1;
        a[w]:=a[w]+x mod 10;
        a[w+1]:=a[w+1]+a[w] div 10+x div 10;
        a[w]:=a[w] mod 10;
        end;
      end;
    b:='';
    while (a[lc]=0) and (lc>1) do
    lc:=lc-1;
    for j:=1 to lc do
      begin
      b:=b+chr(ord(a[j])-48);
      end;
    end;
  writeln(b);
end.

4 楼

我做出来了[em1][em1][em1][em1][em1]!
var n,i,lc,j,k,x,w:longint;
b,c:string;
a:array[1..100000] of longint;
begin
  readln(n);
  b:='1';
  for i:=1 to n do
    begin
    str(i,c);
    lc:=length(c)+length(b);
    for j:=1 to length(b) do
      begin
      for k:=1 to length(c) do
        begin
        x:=(ord(b[j]-48)*(ord(c[k])-48);
        w:=j+k-1;
        a[w]:=a[w]+x mod 10;
        a[w+1]:=a[w+1]+a[w] div 10+x div 10;
        a[w]:=a[w] mod 10;
        end;
      end;
    b:='';
    while (a[lc]=0) and (lc>1) do
    lc:=lc-1;
    for j:=1 to lc do
      begin
      b:=b+chr(ord(a[j])-48);
      end;
    end;
  writeln(b);
end.

5 楼

这种更优化。
var n,i,lc,j,k,x,w,g:longint;
a:array[0..100000] of longint;
begin
  readln(n);
  a[0]:=1;a[1]:=1;
  for i:=2 to n do begin
  g:=0;
  for j:=1 to a[0] do begin
    k:=a[j]*i+g;
    a[j]:=k mod 10;
    g:=k div 10;
    end;
  while g<>0 do begin
  inc(a[0]);
  a[a[0]]:=g mod 10;
  g:=g div 10;
  end;
  end;
  for i:=a[0] downto 1 do write(a[i]);
end.

我来回复

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