質問

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

です

unsigned long long intを試しましたが、定数が大きすぎるというエラーが表示されました。 次に、BigInt-<!> gt;というBigIntライブラリを試しました。 http://mattmccutchen.net/bigint/

問題は、libに関する多くのエラーが発生するため、コードをコンパイルできないことです。

`BigInteger :: BigInteger(int) 'への未定義の参照<!> lt;-これらの多く。

これまでの私のコードは次のとおりです。

#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

役に立ちましたか?

解決

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

という接尾辞を使用して、整数リテラルをlong longとして指定できます。
#include <iostream>

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

    std::cout << num;
}

他のヒント

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

unsigned long long int num = 600851475143ULL;

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

長めに数字を収めることができず、GNU LGPLライセンス( http://www.gnu.org/copyleft/lesser.html )、GNU Multiprecision Library( http://gmplib.org/ )。

非常に高速で、Cで記述されており、非常にクールなC ++-wrapper-libraryが付属しています。

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

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

数字については、すでに述べたように、自然定数はデフォルトでint型になります。長く取得するにはLL / llを使用する必要があります。

この場合、最初に行うことは、符号なしlong longに収まる最大数を把握することです。 64ビットなので、最大数は2 ^ 64-1 = 18446744073709551615になり、これは自分の数よりも大きくなります。その後、あなたは何か間違ったことをしていることを知ったので、それを修正する方法を見つけるためにマーティン・ヨークの答えを見ます。

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

この質問が出されてから5年後にこのライブラリに問題がある他の人にとっては、これが答えです。 プログラムをコンパイルすることはできません。、い不可解なエラーでリンクに失敗します! このライブラリは、.oファイルにコンパイルしてリンクすることになっているc ++ファイルのコレクションです。サンプルプログラムで提供されるmakeファイルの出力を見ると、次のように表示されます。

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をプログラムの名前に置き換え、これらの行をメイクファイルまたはスクリプトに貼り付けて、先に進みます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top