0

まず、私は自分でこれを行っているので、「GMP / xint / bignumを使用する」ことを提案しないでください(該当する場合でも)。

大きな整数(たとえば、9000桁以上)を232表現のint32配列に変換する方法を探しています。数字は基数10の文字列として始まります。

たとえば、string a = "4294967300"ちょうど上にある(基数10の)INT_MAX新しい基数2 32配列に変換したい場合は、になりますint32_t b[] = {1,5}。の場合int32_t b[] = {3,2485738}、基数10の数値はになります3 * 2^32 + 2485738。明らかに、私が使用する数値はint64の範囲を超えているため、文字列を正確に整数に変換して成功への道を変えることはできません。

10進数で減算する関数があります。今はsubtraction(char* number, "2^32")、負の数になるまでに何回カウントするかを考えていますが、数値が大きくなると時間がかかる可能性があります。

誰かが別の変換方法を提案できますか?ありがとう。

編集
タグが表示されなかった場合は申し訳ありませんが、私はC++で作業しています

4

5 に答える 5

1

基数 10 の文字列から数値システムに変換するには、ゼロから始めて、基数 10 の各桁を加算し、10 を掛けます。桁上げがあるたびに、基数 2^32 配列に新しい桁を追加します。

于 2011-11-02T21:25:39.070 に答える
1

これを行う最も簡単な (最も効率的ではありませんが) 方法は、2 つの関数を記述することです。1 つは大きな数に int を乗算する関数で、もう 1 つは int を大きな数に加算する関数です。符号付きの数値によって生じる複雑さを無視すると、コードは次のようになります。

vector明確にするために使用し、実際の質問のコードを追加するために編集されました)

void mulbig(vector<uint32_t> &bignum, uint16_t multiplicand)
{
    uint32_t carry=0;
    for( unsigned i=0; i<bignum.size(); i++ ) {
        uint64_t r=((uint64_t)bignum[i] * multiplicand) + carry;
        bignum[i]=(uint32_t)(r&0xffffffff);
        carry=(uint32_t)(r>>32);
    }
    if( carry )
        bignum.push_back(carry);
}

void addbig(vector<uint32_t> &bignum, uint16_t addend)
{
    uint32_t carry=addend;
    for( unsigned i=0; carry && i<bignum.size(); i++ ) {
        uint64_t r=(uint64_t)bignum[i]  + carry;
        bignum[i]=(uint32_t)(r&0xffffffff);
        carry=(uint32_t)(r>>32);
    }
    if( carry )
        bignum.push_back(carry);
}

次に、これらの関数を使用して atobignum() を実装するのは簡単です。

void atobignum(const char *str,vector<uint32_t> &bignum)
{
    bignum.clear();
    bignum.push_back(0);
    while( *str ) {
        mulbig(bignum,10);
        addbig(bignum,*str-'0');
        ++str;
    }
}
于 2011-11-02T21:42:02.017 に答える
1

bignum クラスにすでに乗算と加算があると仮定すると、それはかなり単純です。

 bignum str_to_big(char* str) {
     bignum result(0);
     while (*str) {
         result *= 10;
         result += (*str - '0');
         str = str + 1;
     }
     return result;
 }

逆の変換も同じ概念ですが、除算とモジュロが必要です

std::string big_to_str(bignum num) {
    std::string result;
    do {
        result.push_back(num%10);
        num /= 10;
    } while(num > 0);
    std::reverse(result.begin(), result.end());
    return result;
}

これらはどちらも署名なし専用です。

于 2011-11-02T21:32:18.730 に答える
0

Docjar : gnu/java/math/MPN.javaには、探しているもの、特に のコードが含まれている可能性があると思いますpublic static int set_str (int dest[], byte[] str, int str_len, int base)

于 2011-11-02T21:27:45.663 に答える
0

数値を 2 進数に変換することから始めます。右から順に、32 ビットの各グループは単一の base2^32 数字です。

于 2011-11-02T21:28:50.890 に答える