2014-09-27 44 views
1

我正在學習C編程語言,並且在寫出Stern-Brocot樹中所需元素的完整路徑時遇到了麻煩。 它只寫出路徑的第一個數字。 我已經設置它寫出0時,左側,1右側時寫道。無論我選擇什麼樣的數字,它可能在3日或15日的水平,它仍然只寫出第一個數字。C編程 - 斯特恩 - 布羅科特樹路徑查找器

這裏是while循環:

while ((p1+p2!=p) && (q1+q2)!=q) { 
    if ((p1+p2)/(q1+q2)<p/q) { 
     printf("1 "); 
     p1+=p2; 
     q1+=q2; 
    } else if (((p1+p2)/(q1+q2)>p/q)) { 
     printf("0 "); 
     p2+=p1; 
     q2+=q1; 
    } 
} 
+0

我忘了補充:最初的p1和p2是數字,q1和q2是分母。 p1/q1,p2/q2。初始值:p1 = q2 = 0和p2 = q1 = 1. p/q是我們正在尋找的給定分數 – Maniak 2014-09-27 12:45:43

+0

您正在進行整數比較。我不確定這是否是你想要的。 – fuz 2014-09-27 12:47:36

+1

另外,你能告訴我們其他代碼嗎? – fuz 2014-09-27 12:48:00

回答

4

既然你沒有顯示使用您使用我會認爲他們是整數類型。如果if語句中的分數四捨五入到最接近的整數,並且您丟失了小數位數,那麼您會犯這個錯誤。快速解決方法是強制代碼執行浮點除法,將整數轉換爲雙精度。

int p = 3 ; 
int q = 5 ; 

int p1 = 0 ; 
int p2 = 1 ; 

int q1 = 1 ; 
int q2 = 0 ; 

while(p1+p2 != p && q1+q2 != q) 
{ 
    if ((p1+p2)/(double)(q1+q2) < p/(double)q) 
    { 
     printf("1 "); 
     p1+=p2; 
     q1+=q2; 
    } 
    else if((p1+p2)/(double)(q1+q2) > p/(double)q) 
    { 
     printf("0 "); 
     p2+=p1; 
     q2+=q1; 
    } 
} 

現在代碼正確輸出0,1,0。這是左,左,右在樹中達到3/5。