[問題] 大數的問題

看板C_and_CPP (C/C++)作者 (沒事不上線,多上線沒事)時間16年前 (2009/05/26 23:05), 編輯推噓3(3025)
留言28則, 9人參與, 最新討論串1/1
以下是我的程式碼,可是如果我要輸入100或500這麼大的數字, 程式就會溢位,有什麼辦法可以讓程式跑像500這麼大的數字嗎? #include<stdio.h> #include<stdlib.h> int fib(int); int main(void) { int n; do { printf("請輸入您想知道兔子數量的期數(1~500):"); scanf("%d",&n); } while(n<1 ||n>500); printf("fib(%d)=%d\n",n,fib(n)); } int fib(int n) { if(n==1 ||n==2) return 1; else return (fib(n-1)+fib(n-2)); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.130.208.135

05/26 23:09, , 1F
把stack改大?不然就不要用遞迴呼叫
05/26 23:09, 1F

05/26 23:48, , 2F
最好是stack改大有用啦 fib(48)就超過2<<31了
05/26 23:48, 2F

05/26 23:54, , 3F
哈哈 別激動~ 你需要的是大數, 用 int array 表示很長的數
05/26 23:54, 3F

05/26 23:54, , 4F
運算要自己寫~
05/26 23:54, 4F

05/27 00:23, , 5F
fib因為總是做加法, 其實用char*做一個簡單的大數/加法
05/27 00:23, 5F

05/27 00:23, , 6F
硬幹出來就搞定了....(光速逃XD)
05/27 00:23, 6F

05/27 00:50, , 7F
公式解吧XD
05/27 00:50, 7F

05/27 02:52, , 8F
請愛用Dynamic Programming
05/27 02:52, 8F

05/27 02:54, , 9F
Time complexity應該是會被O(n) bound住
05/27 02:54, 9F

05/27 03:06, , 10F
如果數字會太大 可以搭配2D array做Dynamic
05/27 03:06, 10F

05/27 03:06, , 11F
Programming
05/27 03:06, 11F

05/27 03:27, , 12F
又或者可以只用三個1D array搭配三樓跟五樓的方法
05/27 03:27, 12F

05/27 03:41, , 13F
是說...費布納西數列照原PO方法做很費時吧,
05/27 03:41, 13F

05/27 03:41, , 14F
感覺越前面的項算越多次,其實每項算一次就可以了?
05/27 03:41, 14F

05/27 04:26, , 15F
嗯 這就是DP裡面的Overlapping problem
05/27 04:26, 15F

05/27 04:27, , 16F
一般來講都可以利用array或是類似的方式
05/27 04:27, 16F

05/27 04:27, , 17F
來避免因為Overlapping造成時間上的浪費
05/27 04:27, 17F

05/27 04:29, , 18F
當然 如果把原PO的program稍改一下 也可以利用DP
05/27 04:29, 18F

05/27 04:30, , 19F
來進行Top-down Approach 也就是利用recursive+array
05/27 04:30, 19F

05/27 04:31, , 20F
來避免stack爆掉的問題
05/27 04:31, 20F

05/27 04:32, , 21F
不過...雖然講是這樣講 其實我不太能確定到底用
05/27 04:32, 21F

05/27 04:33, , 22F
Top-down Approach的方式還會不會有空間上的問題
05/27 04:33, 22F

05/27 04:34, , 23F
這個可能要把recursive的結構用tree畫過才會比較清楚
05/27 04:34, 23F

05/27 07:37, , 24F
A=([0,1;1,1]^500*[0;1]);A(1)=1.3942e+104;
05/27 07:37, 24F

05/27 09:36, , 25F
105位,所以絕非遞不遞迴的問題。
05/27 09:36, 25F

05/27 10:30, , 26F
這篇最主要是因為 int 溢位的問題, 什麼 DP, stack不夠
05/27 10:30, 26F

05/27 10:30, , 27F
這些都是後話了, 原po 應該去找的是大數的 library
05/27 10:30, 27F

05/27 10:31, , 28F
試試 GMP吧
05/27 10:31, 28F
文章代碼(AID): #1A70Kf-n (C_and_CPP)
文章代碼(AID): #1A70Kf-n (C_and_CPP)