主题:难题求助
hxy_anhui
[专家分:320] 发布于 2009-05-27 16:41:00
求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.
最后更新于:2009-05-27 16:42:00
回复列表 (共5个回复)
沙发
小田甜 [专家分:3910] 发布于 2009-05-27 18:37:00
1. Pascal中求整除商使用div如“a div b”而不是“a\b”(这点上来看你是不是学BASIC的)
2. Pascal中字符类型不能直接做加法运算,应该用(ord(c)-48)换成整型。
3. 你的程序没有输出。
4. 你能否解释一下每个变量的意义。
板凳
hxy_anhui [专家分:320] 发布于 2009-05-28 08:26:00
谢谢,我是小学四年级学生,刚从QuickBasic语言转到Pascal,这是我第一次发帖,以后多向版主请教。
3 楼
hxy_anhui [专家分:320] 发布于 2009-05-28 14:08:00
如下程序错在哪里?
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 楼
hxy_anhui [专家分:320] 发布于 2009-05-28 17:37:00
我做出来了[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 楼
hxy_anhui [专家分:320] 发布于 2009-05-28 17:44:00
这种更优化。
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.
我来回复