這是我自己寫的一個C++的程式 目的是要跑出(X+Y)N次方的展開各項係數
然後排序出來
以下為程式碼:
#include
#include
using namespace std;
long oop(int a,int b);
long max(int factory);
int main()
{
int n=0;
cout<<"請輸入整數N:"<
cout<<"(x+y)N次方的各項係數為"<
cout<
system("PAUSE");
return 0;
}
long max(int factory)
{
int k=1;
if(factory==0){
k=1;
}
else{
for(int l=1;l<=factory;l++){
k=k*l;
}
}
return k;
}
long oop(int a,int b)
{
int sum=0;
if(a<0){
cout<<"請重新輸入"<
else {
if(a==0){
sum=1;
}
else{
sum=max(a)/(max(b)*max(a-b));
}
}
return sum;
}
但是卻只能跑到N輸入13...14以後就會出現0或者負數 這是怎麼回事 我的邏輯錯誤或是有什麼BUG嗎?我實在想不出來....
2006-11-09 14:42:49 · 3 個解答 · 發問者 ? 1 in 電腦與網際網路 ➔ 程式設計
你可能在 13! 前就出錯了,只是你沒發現。琳琳說的是對的。你把 int 全換成 unsign long, 範圍會大一些。不然,你要另外寫個大數乘法。
2006-11-10 07:03:59 補充:
你的 max 裡是個階乘,不是個 C(m,n)。所以,在做階乘時,就炸了。int 只到2^31 = 214748364813! = 622702080012! = 479001600這就是原因。不然,你要寫個直接算 C(m,n)的,不透過階乘;但,若 n=1 或 n=m,一樣,要炸。
2006-11-10 07:06:44 補充:
我忘了連續空白會被忽略,重新排版上面那3個大數如下:
2^31 = 21,4748,3648
13! = 62,2702,0800
12! = 4,7900,1600
希忘它有對齊一點。
2006-11-11 09:09:04 補充:
嘿,我最後一句竟然寫錯了!有沒有牆借我撞一撞!
2006-11-11 22:04:25 補充:
C 對 int 用的 byte 數的定義是:CPU 是幾位元,就用幾 BITs。
我把你的 max 照打去 16 位元 (2 bytes) 的 C, 8! 9! 12! 13! 是負的,10! 11! 14! 15! 是正的。
把它改成 long 就可以多算幾位就是了。
2006-11-11 22:05:19 補充:
不然,看你的 compiler 有沒有支援 long long,可以再多幾位。
終極解決法:寫大數乘法
2006-11-09 23:03:46 · answer #1 · answered by ? 7 · 0⤊ 0⤋
我是不知道你要求到多大
不過14次方以上的數值還是可以顯示...但到多少我沒有去做測試
C(16,8)=12870 未超出int
C(20,10)=16628040 未超出4byte int
不過你若是要計算更大數據只有用大數
乃在於你用的方法不當!
但這大概也是最常見之做法
2006-11-10 00:17:26 · answer #2 · answered by ? 4 · 0⤊ 0⤋
k=k*l; 這個數值成長的速度很快.超過它所能表示的範圍..
你這個程式的功能和印 Pascal 三角形差不多.
2006-11-09 15:22:28 · answer #3 · answered by 鳳琳 5 · 0⤊ 0⤋