2010-06-22 4 views
2

Я пытаюсь решить Project Euler # 9, который является http://projecteuler.net/index.php?section=problems&id=9.вычисление пифагорейских триплетов с помощью c

Я просмотрел этот код, и логика кажется правильной ... но я не получаю любой вывод, даже не printfs в цикле. Я (очевидно) новичок C, пытаясь учиться на языках более высокого уровня ... не могли бы вы сказать мне, что происходит не так?

#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; 
} 

Большое спасибо.

EDIT: Хорошо, я исправил проблему с плавающей точкой, как показано выше, но теперь по какой-то причине она никогда не выходит выше двух, делая ее бесконечно замкнутой.

EDIT: Я исправил некоторые ошибки, но все же он возвращает a=33, b=483, c=484, a*b*c=7714476, a+b+c=1000, что не совсем правильно. :(

Ничего себе, я усложнять его. Он теперь работает. Спасибо всем.

+0

Ваш выбор 0,01 как допуска является произвольным - и сомнительным.Однако это также неясно связано со значениями (a = 33, b = 483, c = 484), так как √ (33² + 483²) составляет около 484,126. Вам действительно нужно устранить использование «sqrt()», как по соображениям скорости, так и по точности. –

+0

Вы должны, вероятно, распечатать 'a * a + b * b' и 'c * c'. –

+0

В первый раз, когда ваш код попадает в состояние «if (a + b + c == 1000)», он выходит из обоих циклов, хотя состояние Пифагора не попадает. ** REWRITE ** - Подход с петлями while является ошибочным и излишне сложным. –

ответ

2
if(floor(sc) != sc) continue; // we only want integer values of c 

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

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

+0

Хорошо, это имеет смысл. Есть ли лучший способ проверить, нет ли в float/double десятичной части, что метод float_equality (напольный (двойной), двойной)? –

+1

@aharon: вам нужно использовать только целочисленную арифметику. Учитывая значение для a и b, значение c контролируется вопросом (a + b + c = 1000). Вам просто нужно проверить, есть ли * a + b * b = c * c. Требуется минутная доля секунды, чтобы придумать ответ на моем довольно обычном Mac - с использованием простейших двойных вложенных циклов. Не требуется целая секунда для проверки того, что есть только один ответ, как задает вопрос Project Euler. –

3

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

2

Проект Эйлера Проблема № 9 не требует квадратных корней и не плавает.

+1

Или целые числа, превышающие 32 бит. –

1

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

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

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

Ссылка на страницу проекта Эйлера, вы должны найти пифагорейский триплет «a, b, c», такой как a < b < c 'и' a + b + c = 1000 '. Фактор 1000 не отображается в вашей программе. При значении a и b определяется соответствующее значение c.

+0

Yah, извините, что это было от ошибочного исправления. –

 Смежные вопросы

  • Нет связанных вопросов^_^