2008-10-26 30 views
10

我想在C++變量中放置一個大數字。數字是600851475143C++中的大數字

我試過unsigned long long int但得到一個錯誤,說它常量太大。 我然後嘗試bigInt庫稱爲BigInt - >http://mattmccutchen.net/bigint/

問題是我無法編譯的代碼,因爲我得到許多關於lib的錯誤。

未定義對`BigInteger :: BigInteger(int)'的引用'< - 很多這些。

這是到目前爲止我的代碼:

#include "string" 
#include "iostream"  
#include "bigint/NumberlikeArray.hh" 
#include "bigint/BigUnsigned.hh" 
#include "bigint/BigInteger.hh" 
#include "bigint/BigIntegerAlgorithms.hh" 
#include "bigint/BigUnsignedInABase.hh" 
#include "bigint/BigIntegerUtils.hh" 
using namespace std; 

int main() { 

    //unsigned long int num = 13195; 
    //unsigned long long int num = 600851475143; 
    BigInteger num = 13195; 
    int divider = 2; 

    //num = 600851475143; 

    while (1) { 
     if ((num % divider) == 0) { 
      cout << divider << '\n'; 
      num /= divider; 
     } 
     else 
      divider++; 

     if (num == 1) 
      break; 
    } 
} 

如果我把一個小數目和lib這個程序運行正常不使用BigInt有。 任何幫助將不勝感激:d

+0

歐拉項目#3 ...這是一個棘手的問題...我有同樣的問題。我也看了一下BigInt lib,但我注意到他們沒有正確實現postfix操作符......所以我認爲潛伏在他們的代碼中會存在其他問題。 – paxos1977 2008-10-27 16:27:09

回答

23

您可以通過後綴L.
字面只要指定一個整數,您可以通過後綴LL文字,只要長指定一個整數。

#include <iostream> 

int main() 
{ 
    long long num = 600851475143LL; 

    std::cout << num; 
} 
12

數量爲600851475143不是很長一段長整型太大,但你需要用很長很長的常量(ULL無符號長長整型)時使用的LL後綴:

unsigned long long int num = 600851475143ULL; 
1

有沒有bigint lib鏈接或bigint.cpp編譯?

3

大整數庫的Raison d'etre是表示你的語言本身無法處理的整數。這意味着,你甚至不能把它寫成文字。可能該庫有一種將字符串解析爲大數字的方法。

1

如果您正在獲取未定義的bignum庫參考錯誤,那麼您可能沒有鏈接它。在Unix上,您必須傳遞一個選項,如-lbigint。如果您使用IDE,則必須找到鏈接器設置並添加庫。

至於數字,如前所述,自然常量默認爲int類型。你必須使用LL/ll來獲得很長的一段時間。

1

在這種情況下要做的第一件事是弄清楚你可以放入一個無符號長整數的最大數目是多少。由於它是64位,所以最大的數字是2^64-1 = 18446744073709551615,這比你的數字大。然後你知道你做錯了什麼,你看馬丁約克的答案,看看如何解決它。

2

在一個更一般的情況下,如果您長時間無法適應您的號碼,並且可以使用GNU LGPL許可證(http://www.gnu.org/copyleft/lesser.html),我會建議嘗試使用GNU Multiprecision Library(http://gmplib.org/)。

它速度極快,用C語言編寫,並附帶一個非常酷的C++包裝庫。

0

其他任何人有這個庫後五年,這一問題被問的問題,這是給你答案。 你不能只編譯你的程序,它將無法連接一個醜陋的不可逾越的錯誤! 這個庫是你應該編譯成.o文件並鏈接到的C++文件的集合。如果你看一下提供的示例程序生成文件的輸出,你會看到:

g++ -c -O2 -Wall -Wextra -pedantic BigUnsigned.cc 
g++ -c -O2 -Wall -Wextra -pedantic BigInteger.cc 
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerAlgorithms.cc 
g++ -c -O2 -Wall -Wextra -pedantic BigUnsignedInABase.cc 
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerUtils.cc 
g++ -c -O2 -Wall -Wextra -pedantic sample.cc 
g++ sample.o BigUnsigned.o BigInteger.o BigIntegerAlgorithms.o BigUnsignedInABase.o BigIntegerUtils.o -o sample 

替換sample與你的程序的名字,粘貼在makefile或腳本這些線,並遠離你去。