Проблема Эйлера 3 - мне нужна помощь с этим маленьким кусочком С - PullRequest
1 голос
/ 18 апреля 2011

Я начал решать проблемы http://projecteuler.net/,, но я не могу решить проблему № 3. Думаю, для большинства из вас это будет довольно легко.* также я получаю этот результат:

The largest prime factor of 600851475143 is -127237759.

Ответы [ 6 ]

2 голосов
/ 18 апреля 2011

Проблема заключается в том, что существует максимальное значение, которое может содержать тип long, и когда вы пытаетесь сохранить число больше максимального типа, вы можете удерживать вас может получить отрицательные результаты из-за Система комплиментов 2-х годов.

См. Эту страницу: http://en.wikipedia.org/wiki/Limits.h

Который покажет вам гарантированные минимальные значения, которые будут содержать типы данных.

Итак, вы должны объявить число следующим образом: long long int number = 600851475143LL

Так что оно будет достаточно большим, чтобы вместить число.

1 голос
/ 18 апреля 2011

Как уже говорили другие, вам нужно использовать 64-битные целые числа.Вы также должны использовать %lld в вашем printf.И в идеале избегайте использования sqrt и libm, изменив выражение while на:

while ((i*i)<number && isPrime == true) {
1 голос
/ 18 апреля 2011

Число 600851475143 больше INT_MAX, когда целое число представлено 32-разрядным (что имеет место на самой распространенной платформе).Вам, вероятно, следует изменить все свои переменные и вернуть значения с int до uint64_tstdint.h).Более того, вы должны изменить ваше непосредственное значение на 600851475143LL, чтобы компилятор не приводил его к int.

0 голосов
/ 22 февраля 2014

Похоже, мы находимся в одной лодке .. Я только что опубликовал соответствующий вопрос Время истекает во время исполнения

Я уже занял много времени в качестве типа данных, и моя программа работает, за исключением того, что она останавливает вывод после трех результатов, где он работает нормально для другого числа в задаче 3 в ProjectEuler, т.е. 13195.

Я жду, чтобы это было решено !!

0 голосов
/ 18 апреля 2011

Вместо только long .. Вы также можете использовать long long и double long.так что вы получите ответ в положительном знаке.

0 голосов
/ 18 апреля 2011

Вам нужно взглянуть на ваши интегральные размеры шрифта.Ваше первоначальное число составляет около 600 миллиардов, что не вписывается в 32-разрядное целое число.Что происходит с переполнением со знаком, технически не определено, но большинство современных систем сделают удар по модульной арифметике для вас.

В некоторых системах long составляет 32 бита и 64 бита (что будет работать для вашего использования)Вот).Предполагая, что у вас есть немного C99 на вашей платформе, long long составляет не менее 64 бит.Используйте его.

Будьте осторожны и с промежуточными результатами.Вы используете int в некоторых ваших обработках (i и divider с LargestFactor, и вы даже передаете int на IsItPrime).Используйте long long для всех переменных, участвующих в вычислениях, или вы будете иногда обрезать часть ваших значений.

И, как предложил Сильвен Дефресн, поставьте LL в конце вашего числового литерала.По крайней мере, так будет понятнее.

Если у вашего числа большие простые факторы, у вас будут проблемы с вашим алгоритмом, поскольку, похоже, он будет длиться вечно, но это будет отдельный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...