11

C++ 変数に大きな数値を入れようとしています。番号は 600851475143 です

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

小さい数値を入力し、BigInt lib を使用しない場合、このプログラムは正常に動作します。どんな助けでも大歓迎です:D

4

9 に答える 9

23

整数リテラルはサフィックス L によって long
として指定できます。サフィックス LL によって long long として整数リテラルを指定できます。

#include <iostream>

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

    std::cout << num;
}
于 2008-10-26T17:50:20.260 に答える
13

数値は 600851475143 で、long long int には大きすぎませんが、long long 定数 (unsigned long long int の場合は ULL) を使用する場合は LL サフィックスを使用する必要があります。

unsigned long long int num = 600851475143ULL;
于 2008-10-26T17:53:11.377 に答える
3

大きな整数ライブラリの存在理由は、言語がネイティブに処理できない整数を表現することです。つまり、リテラルとして書き留めることさえできません。おそらく、そのライブラリには、文字列を大きな数として解析する方法があります。

于 2008-10-26T18:00:56.960 に答える
2

より一般的なケースとして、あなたの数字を長い間収めることができず、GNU LGPL ライセンス ( http://www.gnu.org/copyleft/lesser.html ) を使用できる場合は、GNU Multiprecision Library を試すことをお勧めします。 ( http://gmplib.org/ )。

非常に高速で、C で書かれており、非常にクールな C++ ラッパー ライブラリが付属しています。

于 2008-10-27T19:00:33.423 に答える
1

リンクする bigint lib またはコンパイルする bigint.cpp はありますか?

于 2008-10-26T17:53:41.343 に答える
1

bignum ライブラリに対して未定義の参照エラーが発生する場合は、おそらくリンクしていません。Unix では、-lbigint などのオプションを渡す必要があります。IDE を使用している場合は、リンカー設定を見つけてライブラリを追加する必要があります。

数値に関しては、すでに述べたように、自然定数は int 型がデフォルトです。long long を取得するには、LL/ll を使用する必要があります。

于 2008-10-26T18:04:49.807 に答える
1

この場合に最初に行うことは、unsigned long long に収まる最大数を把握することです。これは 64 ビットであるため、最大の数値は 2^64-1 = 18446744073709551615 となり、これはあなたの数値より大きくなります。次に、何か間違ったことをしていることに気づき、Martin York による回答を見て、それを修正する方法を確認します。

于 2008-10-26T19:50:13.183 に答える
0

この質問が出されてから 5 年後にこのライブラリで問題を抱えている他の人にとっては、これが答えです。プログラムをコンパイルすることはできません。醜い不可解なエラーでリンクに失敗します! このライブラリは、.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、これらの行をメイクファイルまたはスクリプトに貼り付ければ、すぐに使用できます。

于 2013-04-08T20:06:49.843 に答える
0

これを試してみてください。基本的に、リンクリストを使用して無限サイズの数を格納する独自のカスタムクラスを作成できます。(RAMが制限です)これを試して ください https://mattmccutchen.net/bigint/

于 2011-03-08T11:24:34.487 に答える