2014-09-27 4 views
1

Я изучаю язык программирования C, и у меня возникают проблемы с записью полного пути к нужному элементу в дереве Stern-Brocot. Он записывает только первый номер пути. Я установил его, чтобы выписать 0 при левом, а 1 - вправо. И какой бы номер я ни выбрал, он может быть на третьем или на 15-м уровне, он все еще записывает только первое число.C Программирование - Stern-Brocot Tree path finder

Вот петля в то время как:

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

+0

. Вы выполняете целые сравнения. Я не уверен, что это то, что вы хотите. – fuz

+1

Кроме того, не могли бы вы показать нам остальную часть кода? – fuz

ответ

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 в дереве.