永发信息网

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

答案:3  悬赏:50  手机版
解决时间 2021-05-24 06:38

题目: 用高精度计算出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.

最佳答案
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位。
全部回答
首先要确定结果的位数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]); }

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

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
地下城不知怎摸了,就是打不开,安全启动也出
东宝区荆门楚之雁国际旅行社(北门营业部)哪位
在word中的网页的粘贴问题
现在做个好人难吗?
求一首好听的日文歌.
黄石港区黄石吴都医药(文星大药房)这个地址在
谁知道安阳哪里有转让的二手罐车啊!价格大概
济源市济源大洋网络地址在哪里啊
飞车多少奇可以收徒
肌肉过久不练是不是会缩水?
是不是生活压力大会导致恐高更严重??
岳麓区长沙好孩子精品幼儿园地址在哪里啊
禹王台区BATTLE(开封市专卖店)怎么去啊,谁知
现在什么样的游戏玩的人最多????
中国海事(长江中路)怎么去啊,有知道地址的么
推荐资讯
我真的很爱她,为什么不敢向她告白?
吃了四环素14天,过多久可以怀孕?
海南特产秀英专营店在什么地方啊,我要过去处
如何解决两极分化
木兰县哈尔滨木兰县文体广电局地址在哪里啊
潢川县信阳城关镇余虹诊所我想知道这个在什么
英语应该从什么基础学起最好
我术后已经半个月了,为什么刀口的右上方里面
学校道路交通安全简报,关于交通安全的简报300
绿野仙踪段落英文,绿野仙踪台词中英文对照 例
博信生态石(博信专卖店)怎么去啊,有知道地址
荣兴苑商住楼地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?