вычисление пифагорейских триплетов с C
-
28-09-2019 - |
Вопрос
Я пытаюсь решить проект Euler #9, который http://projecteuler.net/index.phpsection=problems&id=9..
Я просмотрел этот код, и логика кажется правильной ... но я не получаю Любые Вывод вообще, даже не печатные в курсе. Я (очевидно) новичок, пытаюсь учиться на языках более высокого уровня ... не могли бы вы сказать мне, что происходит не так?
#include <stdio.h>
int main(){
unsigned int a=0, b=0, c=0;
short int pass=0;
while(!pass){
//printf("a = %4d\n", a);
a++;
b=a;
while(!pass){
b++;
c=1000-a-b;
if(b>=c) break;
if(a*a+b*b==c*c) pass = 1;
}
}
printf("a=%d, b=%d, c=%d, a*b*c=%d, a+b+c=%d\n", a, b, c, a*b*c,a+b+c);
return 1;
}
Огромное спасибо.
РЕДАКТИРОВАТЬ: Хорошо, я исправил проблему с плавающей точкой, как показано выше, но сейчас никогда не ходит два по какой-то причине, что делает его петли бесконечно.
РЕДАКТИРОВАТЬ: Я исправил некоторые ошибки, но все же он возвращается a=33, b=483, c=484, a*b*c=7714476, a+b+c=1000
, что не совсем правильно. :(
Вау, я переполнял это. Сейчас работает. Спасибо всем.
Решение
if(floor(sc) != sc) continue; // we only want integer values of c
Возможно, что floor(sc)
всегда неравенство sc
. Анкет Поскольку SC является двойным, операции на нем будут вводить небольшие ошибки. Попробуйте определить небольшую переменную, чтобы обозначить «достаточно близко» и проверьте, находится ли она в этом диапазоне. Видеть здесь для стратегий вокруг этого.
Не уверен, есть ли другие проблемы с вашим кодом.
Другие советы
Не сравнивайте значения плавающих точек, используя ==
или !=
. Анкет Номера с плавающей точкой могут играть всевозможные трюки на вас. Вместо этого попробуйте проверить, если sc
находится в некоторых подходящих небольших диапазонах возле целочисленного числа, и вам понадобится удача.
Проблема проекта Эйлера № 9 не нуждается в квадратных корнях, ни поплавках.
Когда значения «a = 1 ',' b = 2 'в первом проходе внутреннего цикла не удаются (потому что √5 не целое число), цикл снова идет вокруг, с' a = 1 'и' b = 3 'и не удается, потому что √10 не является целым числом, и, действительно, нет значения, кроме нуля (которое исключено из вашей петли), для которого √ (n2 + 12) сам по себе целое число.
Таким образом, до тех пор, пока у вас не закончится диапазон, в котором отдельные значения целочисленного целого числа разделяются, ваш код будет продолжать работать.
Код, связанный с «проходом» и условиями if(b>=c) break;
и (даже больше)if( (a-- + b-- + c) == 7) pass=1;
абсолютно непостижимы. Перепишите код там более четко. Я даже не собираюсь попытаться угадать, что это делает; Я полагаю, что он предназначен для ограничения такого диапазона, что «A + B + C» не превышает 7 или нереабаутов, но я не думаю, что он достигнет желаемого эффекта - даже если вы когда-нибудь должны его выполнить.
Ссылаясь на Project Euler Page, вы должны найти пифагорейский триплет «A, B, C», такой, что «A <B <C» и «A + B + C = 1000». Фактор 1000 не появляется в вашей программе. Учитывая значение A и B, определяется соответствующее значение C.