19

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;
}
4

3 に答える 3

21
const long number = 600851475143;

オーバーフローがあり、長い間その大きな数を保持することはできません。

このリンクを参照してください

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;
}
于 2013-02-01T02:12:28.283 に答える
2

浮動小数点はどこにも表示されませんが、推測しなければならないのは、オーバーフローが原因であるためです。通常のの代わりにunsigned long longまたはを使用します。long longlong

sizeof(long)一部のコンパイラでは、と同様に4と評価されてsizeof(int)います。これは、の制限longが2147483647であることを意味しlong longます。C++標準では、との2倍の少なくとも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

于 2013-02-01T02:10:26.363 に答える
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+1intout == -1 && (x > INT_MAX || x <= INT_MIN)

于 2020-05-17T09:08:13.677 に答える