1

我需要蛮力一年的锻炼。编译器不断抛出这个错误:

bruteforceJS12.cpp:8:28:警告:整数常量对于它的类型来说太大了[默认启用]

我的代码是:

#include <iostream>

using namespace std;

int main(){

    unsigned long long year(0);
    unsigned long long result(318338237039211050000);
    unsigned long long pass(1337);

    while (pass != result)
    {
    for (unsigned long long i = 1; i<= year; i++)
        {

        pass += year * i * year;

        }

        cout << "pass not cracked with year = " << year << endl;
        ++year;

    }

        cout << "pass cracked with year = " << year << endl;
}

请注意,我已经尝试过unsigned long long result(318338237039211050000ULL);

我正在使用 gcc 版本 4.8.1

编辑:

这是使用 InfInt 库http://code.google.com/p/infint/的更正版本

#include <iostream>
#include "InfInt.h"

using namespace std;

int main(){

    InfInt year = "113";
    InfInt result = "318338237039211050000";
    InfInt pass= "1337";

    while (pass != result)
    {
    for (InfInt i = 1; i<= year; i++)
        {

        pass += year * i * year;

        }

        cout << "year = " << year << "  pass = " << pass <<  endl;
        ++year;

    }

        cout << "pass cracked with year = " << year << endl;
}
4

2 回答 2

3

找出系统数字限制的一种快速方法是使用std::numeric_limits。运行以下代码时系统上的输出:

#include <iostream>
#include <limits>

int main()
{   
     std::cout << "ull\t"
              << std::numeric_limits<unsigned long long>::lowest() << '\t'
              << std::numeric_limits<unsigned long long>::max() << std::endl ;
}

是:

ull 0   18446744073709551615

我们可以看到最大值肯定小于您的文字值:

 18446744073709551615
 318338237039211050000

所以你的整数文字对于unsigned long long类型来说太大了。

于 2013-10-31T20:20:46.260 回答
1

您的问题只是318338237039211050000ULL超出范围。

假设 64 位类型,64 位值适用于 log10( 2 64 -1) 十进制数字(即所有 19 位值和一些较低的 20 位值),318338237039211050000ull有 21 位。2 64 -1 ( 18446744073709551615ull) 是最大值。

值 318338237039211050000 至少需要 log10(318338237039211050000)/log10(2) 位。那是69位。

于 2013-10-31T20:21:02.050 回答