2013-02-25 39 views
-3

C++中速度會更快嗎?速度更快...循環還是分裂?

考慮到循環的大小與要劃分的數字中的數字的數量相當,所以是循環或除法。

+3

它可以完成一個循環,沒有分裂。 – Mysticial 2013-02-25 00:19:50

+0

那就是這樣? 有一點提示就足夠了。 – Cheeku 2013-02-25 00:21:18

+0

-1(可以回覆)寫出有意義的標題。 – 2013-02-25 00:37:00

回答

10

這確實是一個循環,無師(使用C++ 11的範圍內,基於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 
} 
+1

你可能想要硬編碼base;它有點誤導,因爲它只適用於'base <= 10';任何以上和10將是':',這不是我知道的任何數字系統。 – icktoofay 2013-02-25 00:24:42

+0

@icktoofay:我只想顯示'base'可能與10不同,但是你是對的,只有在<= 10'時纔有效。將編輯。 – 2013-02-25 00:28:46

+1

這個解決方案很整潔,它運行良好,但是當傳遞包含非數字字符的字符串時會引起怪異。 – 2013-02-25 00:35:51

3

你甚至不需要兩個循環。您可以一次完成,並且在創建整數時,只需在循環結束時停止循環。這比兩個建議的解決方案都快。

+0

這很有幫助。但我原來的問題是什麼會更快,循環或分裂。我相應地編輯了我的問題。 – Cheeku 2013-02-26 14:27:02

2

以初始值num零。在字符串中從左到右遍歷每個字符,將數字乘以10,添加當前數字的值。

1

只要使用霍納的規則。即在C中,假設刺是隻有數字:

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

一個循環,沒有除法。

+0

我相應地修改了這個問題,因爲我想知道。如果我使用循環或分區,什麼會更快? – Cheeku 2013-02-26 14:27:40

0

該部門將需要一定的時間(畢竟這是一條指令),以便與需要測量的內存循環進行比較。回答這樣的問題的一個出發點是Jon Bentley在他的「編程珍珠」中引用了programs。計時程序需要一些按摩才能在當前系統上進行編譯,並調整輸出以免它們一起運行。不要忘記編譯器是聰明的,通常令人驚訝的是,在思考性能改變的代碼之前。