вычисление пифагорейских триплетов с - PullRequest
2 голосов
/ 22 июня 2010

Я пытаюсь решить Project Euler # 9, который http://projecteuler.net/index.php?section=problems&id=9.

Я просмотрел этот код, и логика кажется правильной ... но я не получаю любой *Вывод 1005 * вообще, даже printfs в цикле.Я (очевидно) новичок в C, пытающийся учиться на языках более высокого уровня ... не могли бы вы сказать мне, что происходит не так? Хорошо, я исправил проблему с плавающей запятой, как показано выше, но теперь a почему-то никогда не поднимается выше двух, делая его бесконечным циклом.ошибки, но, тем не менее, он возвращает a=33, b=483, c=484, a*b*c=7714476, a+b+c=1000, что не совсем верно.: (

Ух ты, я это слишком усложнил. Теперь это работает. Спасибо всем.

Ответы [ 4 ]

3 голосов
/ 22 июня 2010

Не сравнивайте значения с плавающей запятой, используя == или !=.Числа с плавающей точкой могут сыграть на вас всякие хитрости.Вместо этого попробуйте проверить, находится ли sc в некотором подходящем небольшом диапазоне рядом с целым числом, и вам повезет больше.

2 голосов
/ 22 июня 2010

Project Euler Задача № 9 не нуждается ни в квадратных корнях, ни в числах с плавающей запятой.

2 голосов
/ 22 июня 2010
if(floor(sc) != sc) continue; // we only want integer values of c

Возможно, что floor(sc) всегда не равно sc. Поскольку sc является двойным, операции над ним будут приводить к небольшим ошибкам. Попробуйте определить небольшую переменную для обозначения «достаточно близко» и проверьте, находится ли она в этом диапазоне. См. здесь для стратегий вокруг этого.

Не уверен, есть ли другие проблемы с вашим кодом.

1 голос
/ 22 июня 2010

Когда значения «a = 1», «b = 2» в первом проходе внутреннего цикла завершаются неудачно (поскольку √5 не является целым числом), цикл снова оборачивается, с «a = 1» и'b = 3' и завершается неудачно, потому что √10 не является целым числом, и, действительно, нет значения N, кроме нуля (которое исключено из вашего цикла), для которого √ (N 2 +1 2 ) само по себе является целым числом.

Таким образом, пока вы не исчерпаете диапазон, в котором отдельные целочисленные значения разделимы, ваш код продолжит работу.

код, связанный с «pass» и условиями if(b>=c) break; и (тем более) if( (a-- + b-- + c) == 7) pass=1; абсолютно непостижим.Перепишите там код более четко.Я даже не собираюсь пытаться угадать, что это делает;Я предполагаю, что он предназначен для ограничения диапазона таким образом, чтобы «a + b + c» не превышало 7, или около того, но я не думаю, что он достигнет желаемого эффекта - даже если вам когда-либо удавалось его выполнить.

Обращаясь к странице Project Euler, вы должны найти пифагорейский триплет 'a, b, c', такой что 'a

...