1樓:嘯嘯_飛
a:=a+1這句去了,不但沒有意義,而且還是個語法錯誤。
改掉之後就行了,階乘數能夠表示出來的也就前十幾個,往後用高精度吧。
pascal高精度演算法求n!(帶講解,初學者。滿意追加)
2樓:趙儀邛宇
階乘的計算。
問題描述。輸入乙個整數n(1<=n<=1000),輸入n!的精確值。
分析:當n比較大時,n!是乙個很大的數,pascal的實數和整數型別均不能儲存,所有考慮用高精度計算。
這個問題的情況比較特殊,我們可以把n!看成(n-1)!*n,這樣參與乘法的兩個數乙個是高精度數(n-1)!,另乙個是常規的整數n.
下面我們看,如何得到n!的精確值,如:12!=12*11!=12*39916800,以些為例說明計算過程:
陣列a(2)在進行計算時將a中的各個元素分別同乘數(這裡是12)相乘,結果存放在當前位,上面的a陣列同12相乘,得到的中間結果為:下標k
陣列a(3)每次乘積運算之後將處理進位,如上例中a[3]將向a[4]進位9,進位後a[3]=6,a[4]=81,同時a[4]在向a[5]進位8,進位後a[4]=1,a[5]=20,a[5]向a[6]進位2,進位後a[5]=0,a[6]=110,a[6]向a[7]進位11,進位後a[6]=0,a[7]=119,a[7]向a[8]進位11,進位後,a[7]=9,a[8]=47,a[8]向a[9]進位4,進位後[8]=7,a[9]=4,a[9]不必向a[10]進位了,到些進位處理完成。通過進位處理後,a陣列中儲存的資料如下:下標k
陣列a此時a陣列中儲存的數就是12!=479001600,這與我們手工計算的結果是一樣的。
varn,i,j,k,x,q:word;
a:array[1..3000]
ofword;
beginwrite('n=')readln(n);
fori:=1to
doa[i]:=0;
k:=1;a[1]:=1;
fori:=2ton
dobegin
forj:=1tok
doa[j]:=a[j]*i;
q:=0;for
j:=1tokdo
beginx:=a[j]+q;
a[j]:=xmod
q:=xdiv
end;while
q>0)
dobegin
k:=k+1;
a[k]:=qmod
q:=qdiv
end;end;
fori:=k
downto
dowrite(a[i]);
writeln;
writeln('k=',k);
end.
有關用pascal程式設計的兩道題急
最簡單的寫法,效率比較低 1var i,j,n,m,count integer flag boolean begin readln n,m count 0 if n 2 then n 2 for i n do m do begin flag true j 2 while flag and j j i...
中興N986電信版怎麼用聯通卡上網,急
你需要先確認下,你用的電信手機支不支援聯通網路,如不支援是無法使用的。另外如是電信合約機是會被鎖網就只能用電信卡。中興n986電信版怎麼用聯通卡上網,急 中興n986電信版國內是鎖定其他運營商網路,則遮蔽了訊號網路導致無法支援聯通號碼使用的。你需要先確認下,你用的電信手機支不支援聯通網路,如不支援是...
用PASCAL語言實現程式要求從1到33裡列出不重複的數加起來的和為100的陣列
vara array 1.6 of integer g,j integer begin g 0 for a 1 1 to 33 do for a 2 2 to 33 do if a 1 a 2 then for a 3 3 to 33 do if a 1 a 3 and a 2 a 3 then f...