2017-08-14 15 views
1

c++に長い文字列番号が入力されているとします。その上で数値演算を行う必要があります。これをintegerに変換するか、操作を実行するための方法が必要です。それらは何ですか?大量の文字列をC++で整数に変換するにはどうすればよいですか?

string s="12131313123123213213123213213211312321321321312321213123213213"; 
+2

概念を文書化するには、ここだけですビンガム図書館。 –

答えて

0

文字列がstd::numeric_limits<uint64_t>::max()未満の番号が含まれている場合、std::stoull()は最高意見です。

unsigned long long = std::stoull(s); 

C++11およびそれ以降。

2

大量の計算ライブラリを使用することをお勧めします。最高の

一つは

Function: int mpz_set_str (mpz_t rop, const char *str, int base)

は、STRからROPの値を設定し、あなたの問題を解決するために::便利な機能のGNU Multiple Precision Arithmetic Library

例があるから、nullでベースのC文字列は、 ベースで終了します。空白は文字列内で許可され、単に無視されます。

塩基は2から62まで変化してもよい、または塩基が0である場合、主要 文字が使用された:0xと0Xを進、0Bと0Bのためのバイナリのために、 オクタル0、または小数さもなければ。

最大36の場合、大文字小文字は無視されます。大文字と小文字の の値は同じです。塩基37〜62の場合、大文字は 、通常は10..35、小文字は36..61を表します。

この関数は、文字列全体が基底の有効数字である場合、0を返します。 ベース。それ以外の場合は-1を返します。

ドキュメント:https://gmplib.org/manual/Assigning-Integers.html#Assigning-Integers

2

あなたが処理したい数字は任意の標準整数型のための大きなへの道なので、ちょうどそれはあなたに多くを与えることはありません「変換」のように見えます。あなたは、2つのオプションがあります。

  1. (!強く推奨)は、例えば同じよう大きな整数ライブラリを使用しますgmp。このようなライブラリは、通常、大きな数字を解析してフォーマットする機能も提供します。

  2. あなた自身で大きな数字を実装してください。 の配列をuintmax_tとしてください。おそらくあなた自身が必要とするあらゆる種類の算術を実装しなければならないでしょう。これは簡単なことではありません。番号の解析には、を逆にしてdouble dabbleの実装を使用できます。たとえば、Cで前に書いたコードは、のようにとして使用できますが、いくつかのヘルパー関数を提供する必要があり、std::stringのようなC++の機能を使用して書き換えたい場合は、structstd::vectorとここに使用 - それは、そのような数は「通常の」整数型に合わないことができ、あなたは自分を必要とする操作を再実装、または使用するか持っていることを考えると

    typedef struct hugeint 
    { 
        size_t s;  // number of used elements in array e 
        size_t n;  // number of total elements in array e 
        uintmax_t e[]; 
    } hugeint; 
    
    hugeint *hugeint_parse(const char *str) 
    { 
        char *buf; 
    
        // allocate and initialize: 
        hugeint *result = hugeint_create(); 
    
        // this is just a helper function copying all numeric characters 
        // to a freshly allocated buffer: 
        size_t bcdsize = copyNum(&buf, str); 
    
        if (!bcdsize) return result; 
    
        size_t scanstart = 0; 
        size_t n = 0; 
        size_t i; 
        uintmax_t mask = 1; 
    
        for (i = 0; i < bcdsize; ++i) buf[i] -= '0'; 
    
        while (scanstart < bcdsize) 
        { 
         if (buf[bcdsize - 1] & 1) result->e[n] |= mask; 
         mask <<= 1; 
         if (!mask) 
         { 
          mask = 1; 
          // this function increases the storage size of the flexible array member: 
          if (++n == result->n) result = hugeint_scale(result, result->n + 1); 
         } 
         for (i = bcdsize - 1; i > scanstart; --i) 
         { 
          buf[i] >>= 1; 
          if (buf[i-1] & 1) buf[i] |= 8; 
         } 
         buf[scanstart] >>= 1; 
         while (scanstart < bcdsize && !buf[scanstart]) ++scanstart; 
         for (i = scanstart; i < bcdsize; ++i) 
         { 
          if (buf[i] > 7) buf[i] -= 3; 
         } 
        } 
    
        free(buf); 
        return result; 
    } 
    
関連する問題