-3

在 C++ 中什么会更快?

循环或除法,考虑到循环的大小与被除数中的位数相当。

4

5 回答 5

10

这是一个循环,没有除法(使用 C++11 的 range-based for,但可以很容易地重写为没有):

std::string s = "123";
int base = 10; // Must be <= 10, or the technique below won't work
int n = 0; for (char c : s) { n = n * base + (c - '0');  }
std::cout << n; // Should output 123

编辑:

一个更安全、稍微复杂一点的解决方案,它将解析字符串直到遇到非数字字符:

#include <iostream>

int convert(std::string const& s, int base)
{
    int n = 0;
    for (char c : s)
    {
        if (!isdigit(c)) { break; }
        n = n * base + (c - '0');
    }

    return n;
}

int main()
{
    std::string s = "123d";
    cout << convert(s, 10) << endl; // Should output 123
}
于 2013-02-25T00:21:30.937 回答
3

你甚至不需要两个循环。您可以一次性完成,并且在创建整数时,只需在循环到达字符串末尾时停止循环。这比两个建议的解决方案都快。

于 2013-02-25T00:21:13.683 回答
2

从零的初始数字开始。从左到右遍历字符串中的每个字符,将数字乘以 10,再加上当前数字的值。

于 2013-02-25T00:28:41.050 回答
1

只需使用霍纳的规则。即,在 C 中,假设刺痛只是数字:

value = 0;
for(p = str; *p; p++)
   value = 10 * value + *p - '0';

一个循环,没有分裂。

于 2013-02-25T01:33:47.510 回答
0

除法将花费恒定的时间(毕竟这是一条指令),将其与循环内存进行比较需要一些测量。回答这些问题的起点是Jon Bentley 在他的“Programming Pearls”中引用的程序计时程序需要一些按摩才能在当前系统上编译,并调整输出使其不会一起运行。并且永远不要忘记编译器很聪明,通常令人惊讶的是,在考虑为了性能而修改代码之前。

于 2013-02-26T14:42:10.527 回答