我不知道为什么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;
}
答案 0 :(得分:18)
const long number = 600851475143;
有溢出,长期不能容纳那么大的数字。
请参阅this link
LONG_MAX is 2147483647
尝试:
const unsigned long long number = 600851475143;
unsigned long longmax = 0;
编辑:
你不能%对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;
}
答案 1 :(得分:2)
我没有在任何地方看到浮点,但如果我不得不猜测它是因为它是由于溢出。使用unsigned long long
或long long
代替常规long
。
sizeof(long)
已评估为4,类似于sizeof(int)
,这意味着long
的限制为2147483647. {C ++标准要求long long
至少为64位,是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
答案 2 :(得分:0)
对我来说,在制作产品时检查整数溢出时会出现此错误:
#define INT_MIN -2147483648 // -2^31
#define INT_MAX 2147483647 // 2^31-1
int out=-1, x=-5;
if ((out > 0 && (x > INT_MAX/out || x < INT_MIN/out)) ||
(out < 0 && (x < INT_MAX/out || x > INT_MIN/out))) {
// what to do for overflow
} else {
out *= x;
}
问题在于,因为abs(INT_MIN) > abs(INT_MAX)
恰好在out=-1
时,条件INT_MIN/out
导致int
溢出(由于0
,所以没有足以容纳INT_MAX+1
中的int
)。我添加了一个新条件来解决浮点问题:out == -1 && (x > INT_MAX || x <= INT_MIN)