Получение исключения с плавающей запятой: 8 - программирование
Подтвердить что ты не робот

Получение исключения с плавающей запятой: 8

Я понятия не имею, почему g++ не нравится мой код. В java он отлично работал. Любые идеи были бы оценены.

#include<iostream>

using namespace std;

bool isPrime(long number);

int main(){
const long number = 600851475143;
long max = 0;
for(long i= 0; i*i <= number; i++)
    if(number % i == 0 && isPrime(i))
        max = i;
cout<< max << endl;

return 0;
}

bool isPrime(long number){
if(number <= 1) return false;
if(number == 2) return true;
if(number % 2 == 0) return false;

for(long     i= 3; i*i <= number; i+=2)
    if(number % i == 0)
        return false;
return true;
}
4b9b3361

Ответ 1

const long number = 600851475143;

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

см. эта ссылка

LONG_MAX is 2147483647

попробовать:

const unsigned long long number = 600851475143;
unsigned long longmax = 0;

Edit:

Вы не можете% против 0, i начинается с 0

for(long i= 0; i*i <= number; i++)
           ^^
{
    if(number % i == 0 && isPrime(i))
               ^^^
{
   max = i;
   cout<< max << endl;
}

}

Незначительное изменение рабочей версии:

bool isPrime(unsigned long long  number);

int main(){

    const unsigned long long number = 600851475143;
    unsigned long long max = 0;
    for(long i = 1; i*i <= number; i++)
    {
        if(number % i == 0 && isPrime(i))
        {
            max = i;
            cout<< max << endl;
        }
    }
    return 0;
}

bool isPrime(unsigned long long  number)
{
    if(number <= 1) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;

    for(unsigned long long i= 3; i*i <= number; i+=2)
    {
        if(number % i == 0)
        {
            return false;
        }
    }
    return true;
}

Ответ 2

Я не вижу плавающей точки в любом месте, но если бы мне пришлось это угадывать, потому что из-за переполнения. Используйте unsigned long long или long long вместо обычного long.

sizeof(long) на некоторых компиляторах оценивается как 4, аналогично sizeof(int), что означает, что предел long равен 2147483647. long long требуется, чтобы стандарт С++ составлял не менее 64 бит, double значение long и int, которое имеет подписанный максимум 9223372036854775807.

Ошибка возникает из вашего кода: Вы выполняете модуль на ноль, что неверно.

Подумайте об этом вместо этого:

#include <iostream>

using namespace std;

bool isPrime(unsigned long long number);

int main(){
    const unsigned long long number = 600851475143;
    unsigned long long max = 0;
    for(unsigned long long i= 1; i*i <= number; i++)
        if(number % i == 0 && isPrime(i))
            max = i;
    cout<< max << endl;

    return 0;
}

bool isPrime(unsigned long long number) {
    if(number <= 1) return false;
    if(number == 2) return true;
    if(number % 2 == 0) return false;

    for(unsigned long long i= 3; i*i <= number; i+=2)
        if(number % i == 0)
            return false;
    return true;
}

Обратите внимание, что i = 0 был изменен на i = 1