2

私は独自の文字列クラスを構築しており、この関数を使用して数値文字列を整数に変換しようとしています:

int String::convertToInt() const {  
    int exp = length() - 1;
    int result = 0;

    for(int i = 0; i < length(); ++i) {
        result += (charAt(i) - '0') * (10 ^ exp);
        --exp;
    }   
    return result;
}

何かが正しく機能していませんが、それが何であるかを特定できません。「49」をintに変換しようとすると、134に変換されます。

4

3 に答える 3

9

^XORです。を探していると思いますstd::pow(10, exp)

またはこれでも:

int String::convertToInt() const {  
    int order = std::pow(10, length() - 1);
    int result = 0;

    for(int i = 0; i < length(); ++i) {
        result += (charAt(i) - '0') * order;
        order /= 10;
    }   
    return result;
}
于 2013-11-01T13:29:07.440 に答える
3

最も簡単な方法は、 が であり、同様に が であることを理解49する4 * 10 + 9こと493です49 * 10 + 3

つまり、結果は最初の N-1 桁と最後の桁の 10 倍になります。これをループまたは再帰関数として記述できます。スタックの深さは問題ありません。約 20 桁の後、64 ビットの結果でもオーバーフローします。そう

int String::convertToInt() const {
    if (empty()) return 0; // Recursive functions better terminate.
    // TODO: negative numbers.  
    return 10 * convertToInt(substr(0, length()-1)) + (back() - '0');
}

また

int String::convertToInt() const {
    // TODO: negative numbers.  
    int result = 0;

    for(int i = 0; i < length(); ++i) {
        result * = 10;
        result += (charAt(i) - '0');
    }   
    return result;
}
于 2013-11-01T13:32:49.010 に答える
0

より効率的なアプローチは次のとおりです。

// I know you said you are using something else
// but the same principle applies here
std::string s = "12345";

unsigned int result = 0;
unsigned int place = 1;
for (std::size_t i = s.length() - 1; i >= 0; --i, place *= 10)
{
    result += (s[i] - '0') * place;
}

基本的に、一番右のキャラクターから始めて、左に向かって作業します。左に移動する各文字は、10 を掛けますplace(私たちのほとんどが成長して足し算を行うことを学んだ方法と非常に似ています: 1 を追加する ... 10 を追加する ... 100 を追加する ... など)。これは、文字列に数字 ('0' ~ '9') しか含まれていないことを既に知っていることも前提としています。

于 2013-11-01T14:57:16.643 に答える