web-dev-qa-db-ja.com

整数定数が「長い」タイプには大きすぎます

重複の可能性:
C/C++ではlong long

プロジェクトオイラー問題のための簡単なプログラムを書く。 "整数定数が"長い "型"には大きすぎるため、コンパイルを拒否しますのサイズ制限内に十分収まるはずですがunsigned long long。 dev-c ++コンパイラを使用します。

問題のコード:

#include <iostream>

bool isprime (unsigned long long i)
{
    if(i==1||i==0) return false;
    if(i==2) return true;
    for(unsigned long long k=2;k!=i-1;k++)
    {      
        if(i%k==0) return false;
    }
    return true;
}

int main()
{
    for(unsigned long long i=600851475143;i>=0;i--) //problematic line
    {
        if(isprime(i))
        {
            std::cout<<i;
            std::cin.get();
            return 0;
        }
    }
}
18
Bacu

「ULL」サフィックスを試してください:600851475143ULL

29
Fred Larson

入力されたリテラルの型はintであり、値を保持するのに十分な大きさではありません。最初の修正として600851475143ULLを試してください。

それでも、unsignedが0未満になることはないため、forループが終了することはありません。代わりに、long long600851475143LLを使用してください。

4
Mark B

long longデータ型のdev-c ++サポートの制限である必要があります。 MS VC++ 2010で正常にコンパイルされます。

0
FumbleFingers