永发信息网

free pascal 兼程问题 (测到40以后就出错了) 高手指点!!!

答案:3  悬赏:50  手机版
解决时间 2021-05-24 06:38
  • 提问者网友:骑士
  • 2021-05-23 22:51

题目: 用高精度计算出S=1!+2!+3!+…+n!(n≤50)

             其中“!”表示阶乘,例如:5!=5*4*3*2*1。

             输入正整数N,输出计算结果S。

我的程序:

program jc;

var
 i,j,n,w,m:longint;
 a:array[1..2,1..100]of longint;
 c:array[1..100]of longint;
 procedure add;
  begin
   for i:=1 to w do
    begin
     inc(c[i],a[2,i]);
     if c[i]>=10 then
      begin
       dec(c[i],10);
       inc(c[i+1]);
      end;
    end;
  end;
 procedure jc(q,p:longint);
  begin
   w:=p;
   for i:=1 to p do
    begin
     m:=i;
     a[2,m]:=a[1,m]*q+a[2,m];
     if a[2,m]>=10 then
      while a[2,m]>=10 do
       begin
        if m=w then inc(w);
        repeat
         dec(a[2,m],10);
         inc(a[2,m+1]);
        until a[2,m]<10;
        inc(m);
       end;
     while a[2,w+1]<>0 do inc(w);
    end;
   add;
   a[1]:=a[2];
   for i:=1 to 50 do a[2,i]:=0;
   if q<n then jc(q+1,w);
  end;
begin
 readln(n);
 a[1,1]:=1;
 c[1]:=1;
 if n>=2 then jc(2,1);
 for i:=w downto 1 do write(c[i]);
 readln;
end.

最佳答案
  • 五星知识达人网友:舍身薄凉客
  • 2021-05-24 00:11
var i,j,n,w,m:longint; a:array[1..2,1..1000]of longint; c:array[1..1000]of longint; procedure add; begin for i:=1 to w do begin inc(c[i],a[2,i]); if c[i]>=10 then begin dec(c[i],10); inc(c[i+1]); end; end; end; procedure jc(q,p:longint); begin w:=p; for i:=1 to p do begin m:=i; a[2,m]:=a[1,m]*q+a[2,m]; if a[2,m]>=10 then while a[2,m]>=10 do begin if m=w then inc(w); repeat dec(a[2,m],10); inc(a[2,m+1]); until a[2,m]<10; inc(m); end; while a[2,w+1]<>0 do inc(w); end; add; a[1]:=a[2]; for i:=1 to 500 do a[2,i]:=0; if q<n then jc(q+1,w); end;begin readln(n); a[1,1]:=1; c[1]:=1; if n>=2 then jc(2,1); for i:=w downto 1 do write(c[i]); readln;end.订正完毕。 for i:=1 to 50 do a[2,i]:=0;改为 for i:=1 to 500 do a[2,i]:=0;即可。因为清a[2]零到后面的时候位数会大于50位。
全部回答
  • 1楼网友:大漠
  • 2021-05-24 01:11
首先要确定结果的位数k,然后定义数组的大小,这一过程可单独做,并不需放在程序中。将阶乘的结果存放在数组并累加到S数组中,最后输出结果。源程序如下: #include #include #define N 66 main() { int s[N] = {0}, a[N] = {0}; int i, j, k, n, digit = 1; printf("Input N:"); scanf("%d", &n); a[0] = 1; s[0] = 1; if(n == 1) printf("s= %d", s[0]); for(k = 2; k <= n; k++) { for(j = 0; j < digit; j++) a[j] *= k; for(j = 0; j < digit; j++) { if(a[j] >= 10) { a[j + 1] += a[j] / 10; a[j] = a[j] % 10; if(j == digit - 1) digit++; } } for(i = 0; i < digit; i++) s[i] += a[i]; for(i = 0; i < digit; i++) { if(s[i] >= 10) { s[i + 1] += s[i] / 10; s[i] = s[i] % 10; if(i == digit - 1) digit++; } } } for(i = digit - 1; i >= 0; i--) printf("%d", s[i]); }
  • 2楼网友:冷風如刀
  • 2021-05-24 00:30

我测过50以内没问题 若是error 201 因为你数组开太小了

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯