Получение исключения с плавающей запятой: 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;
}
Ответы
Ответ 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