вычисление пифагорейских триплетов с C

StackOverflow https://stackoverflow.com/questions/3089507

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top