[問題] 一個關於遞回的問題

看板C_and_CPP (C/C++)作者 (杰克)時間15年前 (2010/10/03 21:46), 編輯推噓4(408)
留言12則, 6人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) long sum(int n) { if(n==2) return 1*2; return (n*(n-1)+sum(n-1)); } int main() { int n; printf("key in:"); scanf("%d",&n); printf("sum(%d) = %i",n,sum(n)); system("PAUSE"); return 0; } 希望得到的正確結果: 這是計算1*2+2*3+3*4+....+(n-1)*n的遞回函式 只是我發現當我輸入37500或是37555時,卻會出現負號, 但我輸入100000時,沒有問題,想請問是甚麼原因呢? 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) 有問題的code: (請善用置底文標色功能) 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.27.29

10/03 21:51, , 1F
overflow了
10/03 21:51, 1F

10/03 21:53, , 2F
等等 題目看錯了
10/03 21:53, 2F

10/03 21:56, , 3F
不過大概也是overFlow造成的 37500*37499大概就 2^31次方了
10/03 21:56, 3F

10/03 22:01, , 4F
你確定輸入十萬的時候答案正確嗎><
10/03 22:01, 4F

10/03 22:31, , 5F
unsigned int
10/03 22:31, 5F

10/03 22:31, , 6F
這 unsigned int 也不夠吧...
10/03 22:31, 6F

10/03 22:35, , 7F
DWORD64應該夠了吧
10/03 22:35, 7F

10/03 22:45, , 8F
sum(37500)=17578124987500 (大概...XD)
10/03 22:45, 8F

10/03 22:49, , 9F
我記得long在x86上跟int一樣大吧,而且long是有正負的吧
10/03 22:49, 9F

10/03 23:13, , 10F
long 多長是看 compiler 而定
10/03 23:13, 10F

10/03 23:15, , 11F
要準確的多大用 stdint.h 裡面的intxx_t吧
10/03 23:15, 11F

10/03 23:38, , 12F
先挑一個錯好了..long->%ld,改unsigned long的話->%lu
10/03 23:38, 12F
文章代碼(AID): #1Cg8bDpk (C_and_CPP)
文章代碼(AID): #1Cg8bDpk (C_and_CPP)