Re: [問題] 二維動態陣列 free會錯誤

看板C_and_CPP作者 (很久沒唬爛了)時間16年前 (2009/10/22 13:09), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
: int catalan(void){ : int i,Cn=1,c=1; : for (i=n+1;i<=2*n;i++){ : Cn=Cn*i; : c=c*(i-n); : } : Cn=Cn/((n+1)*c); : printf("\nThere are %d sequence in Cn! \n",Cn); : return Cn; : } 對不起我自回一下 我想要得到Catalan數列的第n項,但一開始用的碼(如上),當n很大時 ,變數cn就會溢位(應該是它沒錯) 就算我用unsigned int 也沒好多少。 但若我改用遞迴 unsigned int catalan(unsigned int t){ unsigned int i; unsigned int Cn=0; if (t>1){ for (i=1;i<=t;i++){ Cn=Cn+catalan(i-1)*catalan(t-i); } return Cn; }else{ return 1; } return Cn; } 似乎不會有溢位,但是當n>15之後,計算時間就很明顯的拉長 請問這程式碼要怎樣改進比較好? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.155.103

10/22 13:11, , 1F
用個陣列記住 catalan[i] 算過就不用重算
10/22 13:11, 1F
感謝,改寫後變這樣 cata[n]是設成全域變數的動態陣列 unsigned int catalan(unsigned int t){ unsigned int i; unsigned int Cn=0; if (cata[t]==1){ if (t>1){ for (i=1;i<=t;i++){ Cn=Cn+catalan(i-1)*catalan(t-i); } cata[t]=Cn; return Cn; }else{ return 1; } }else{ return cata[t]; } return Cn; } ※ 編輯: dj533kevin 來自: 124.8.155.103 (10/22 13:26)

10/22 13:47, , 2F
順帶一提, Catalan 數是成指數成長, 所以在n=20左右會溢位
10/22 13:47, 2F
文章代碼(AID): #1At-a460 (C_and_CPP)
文章代碼(AID): #1At-a460 (C_and_CPP)