2013-10-31 39 views
1

我需要对一年的练习进行暴力破解。编译器不断抛出此错误:C++:整数常量对于其类型来说太大

bruteforceJS12.cpp:8:28: warning: integer constant is too large for its type [enabled by default]

我的代码是:

#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库012的更正版本

#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; 
} 
+0

您应该使用ASCII表示法。 –

+0

使用'unsigned long long result = 318338237039211050000ULL;'失败吗?它可能只是它不喜欢这种初始化方法? –

+0

@ScottMermelstein:文字后缀不适用于* that *目的。如果存在这样的类型,则整型文字已具有可表示它的类型。 –

回答

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类型。

+0

谢谢。与其试图找到支持这个操作的库,我会用python实现相同的代码。 – 01BTC10

+1

最后是通过这个库http://code.google.com/p/infint/ – 01BTC10

1

你的问题很简单,318338237039211050000ULL超出范围。

假设一个64位的,64位值是良好的日志10(2 -1)位十进制数(即,所有19位的值和一些较低20个值),318338237039211050000ull有21位数字。 2 -1(18446744073709551615ull)是最大值。

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

+2

做到的你不需要后缀;编译器给它一个将保存该值的类型。 –

+0

@petebecker所有整数文字默认为int,所以您需要使用后缀 – texasbruce

+0

@texasbruce:这是不正确的。未固定的十进制整数字面量的类型是可以表示其值的“int”,“long int”,“long long int”中的第一个。 (该列表在标准的早期版本中有所不同。)请参阅C++标准中的第2.14.2节[lex.icon]。 –

相关问题