Другие языки программирования и технологии

Помогите С++ для начинающих см. внутри

Подскажите как for'om сократить дробь, дробь дробь в виде (к примеру): int a = 4; - числитель int b = 16; - знаменатель как правильно перебирать числа для деления, проверять на делимость. чем можете, как говорится, помогите)))))))))))) for(int temp = 2; temp < b; temp++) { if(a % temp && b % temp) { a = a/temp; b = b/temp; temp = 1; } } - вот набросал, все ли правильно???
АМ
Аман Молдаш
4 187
Замечания по представленной версии:
0) проверка a==1 это, похоже, просто опечатка.. .
1) где в условии сказано, что дробь правильная (числитель меньше знаменателя) ?
С неправильной дробью эта программа не справится.. . (причем, по двум разным причинам! ) (например, 6/3)
2) Так, программа даже не входит в цикл (и, естественно не сокращает) , если дробь равна 2/2; да и вообще не сокращает дроби c числителем равным знаменателю.
3) Зачем вообще после сокращения начинать цикл "сначала", с двойки? ведь уже проверено, что на все числа до текущего temp дробь не сокращается!
4) и, как совершенно правильно отмечено Сыроежкой, менять переменную цикла очень "неприлично"...

По-моему, вообще самый простой способ — найти наибольший общий делитель числителя и знаменателя (алгоритм Евклида) , да и разделить на него:

int m = a, n = b;
while (m && n) // (m!=0 && n!=0)
    if (m > n) m %= n;
    else n %= m;
n |= m; // можно вместо этого: if (m) n = m;
// здесь n = НОД (a,b)
a /= n; b /= n;

———————————————————————
А уж если позарез нужно использовать for... :) напишите вместо
while( m && n ) ...хи-хи.. . for( ; m&&n; )
***василий*** **савинкин**
***василий*** **савинкин**
96 239
Лучший ответ
Не совсем на мой взгляд корректный код. Что ознеачает в конце тела цикла присвоение счетчику цикла temp значения 1?!

{
ch3 = ch3/temp;
zn3 = zn3/temp;
temp=1;
}

Почему не присвоить temp 2, если цикл начинается с 2?!

Вообще-то это очень плохо менять значение счетчика цикла 'for' внутри тела цикла! В таком случае лучше изменить цикл 'for' на цикл 'while'.