Другие языки программирования и технологии
Помогите С++ для начинающих см. внутри
Подскажите как 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; } } - вот набросал, все ли правильно???
Замечания по представленной версии:
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; )
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; )
Не совсем на мой взгляд корректный код. Что ознеачает в конце тела цикла присвоение счетчику цикла temp значения 1?!
{
ch3 = ch3/temp;
zn3 = zn3/temp;
temp=1;
}
Почему не присвоить temp 2, если цикл начинается с 2?!
Вообще-то это очень плохо менять значение счетчика цикла 'for' внутри тела цикла! В таком случае лучше изменить цикл 'for' на цикл 'while'.
{
ch3 = ch3/temp;
zn3 = zn3/temp;
temp=1;
}
Почему не присвоить temp 2, если цикл начинается с 2?!
Вообще-то это очень плохо менять значение счетчика цикла 'for' внутри тела цикла! В таком случае лучше изменить цикл 'for' на цикл 'while'.
Похожие вопросы
- Помогите найти одну программу (см. внутри)
- Помогите плиз, что делать? см. внутри
- Помогите построить треугольник C++ ( См. внутри )
- Как сделать такой эффект в фотошопе? См.внутри
- Выберите лучшую картинку. См. Внутри!
- люди что можно удалить из автозагрузки(см внутри),комп домашний,соединение проводное?
- Вирус на компе помогите вырубать боюсь вдруг не включится потом помогите см.внутри
- при нажатии значка громкость выскакивает такое сообщение см. внутри
- Специалисты! Помогите восстановить систему! (см. внутри)
- Помогите решить задание по информатике. Нужно написать программу по заданию (см. внутри)