У меня есть программа, которая определяет, является ли треугольник тупой треугольник. Программа инструктирует пользователя ввести 3 значения длины стороны (s1, s2, s3). Если квадратное значение меньших двух значений длины стороны меньше квадратного значения наибольшего значения стороны, то это тупой треугольник.
Например:
s1 = 3, s2 = 5, s3 = 9
3 ^ 2 + 5 ^ 2 < 9 ^ 2
34 < 81
Это тупой треугольник.
У меня есть две версии моей программы, показанные ниже, и обе дают одинаковый вывод. Мой вопрос, какой из них более эффективен? или есть другая версия, которая более эффективна, чем две мои версии?
Версия 1:
double s1,s2,s3;
cout << "Enter three numbers -> ";
cin >> s1 >> s2 >> s3;
if (max(max(s1,s2),s3) == s1){
if(pow(s2,2)+pow(s3,2) < pow(s1,2)){
cout << "This is an obtuse triangle";
} else {
cout << "Not an obtuse triangle";
}
} else if (max(max(s1,s2),s3) == s2){
if(pow(s1,2)+pow(s3,2) < pow(s2,2)){
cout << "This is an obtuse triangle";
} else {
cout << "Not an obtuse triangle";
}
} else {
if(pow(s1,2)+pow(s2,2) < pow(s3,2)){
cout << "This is an obtuse triangle";
} else {
cout << "Not an obtuse triangle";
}
}
Версия 2:
double s1,s2,s3;
cout << "Enter three numbers -> ";
cin >> s1 >> s2 >> s3;
if( max(s1,s2) < s3){
if(pow(s1,2) + pow(s2,2) < pow(s3,2)){
cout << "This is an obtuse triangle";
} else {
cout << "Not an obtuse triangle";
}
} else {
if(pow(min(s1,s2),2) + pow(s3,2) < pow(max(s1,s2),2)){
cout << "This is an obtuse triangle";
} else {
cout << "Not an obtuse triangle";
}
}
Без использования профилировщика вы можете реально оценить эффективность того, сколько дорогостоящих операций вы выполняете. В вашем случае «пау» — единственная действительно дорогая операция.
Поскольку оба решения вычисляют pow (x, 2) только один раз для каждого значения x (s1, s2, s3), они одинаково эффективны.
Операторы «if» и сравнения (функция «max») дешевы, и о них не стоит беспокоиться.
Два решения функционально одинаковы.
Других решений пока нет …