2014-02-28 84 views
-2

我是一名編程初學者。我正在編寫學校作業,並要求我使用遞歸將逗號添加到字符串中。我大部分都完成了,但是當我輸入一個大於一百萬的數字時,它不會在第一個數字前添加逗號。這是我到目前爲止:如何使用遞歸將逗號添加到字符串

// commas - Convert a number (n) into a string, with commas 
string commas(int n) { 

    ostringstream converted; 
    converted << n; 

    string number = converted.str(); 

    int size = number.length(); 

    if (size < 4) 
    { 
    return number; 
    } 
    if (size >= 4) 
    { 
     return number.substr(0, number.size() - 3) + "," + number.substr(number.size() - 3, number.length()); 
    } 
} 

任何幫助將不勝感激!

+1

函數名是如何命名的?遞歸調用在哪裏?顯示更多代碼。第二個「if」可能只是一個「else」 –

+0

遞歸在哪裏? – uncletall

+0

您不會爲'1000000'添加特殊情況,因此它看起來像是'1000,000'。 – 2014-02-28 07:47:07

回答

2

該算法相當簡單。它與您的解決方案非常相似,只是我添加了遞歸所需的部分。要了解它的工作原理,請刪除tack_on。下面是示例輸出:

1 
10 
100 

這些是當達到(s.size() < 4)終止條件時返回所述第一組。然後其餘的組以「逗號」作爲前綴。整個字符串是使用遞歸構建的。這一點很重要,因爲如果你在離開number.substr(0, number.size() - 3),你的輸出應該是這樣的:

11,000 
1010,000 
100100,000 
11,0001000,000 

我用std::to_string這是C++ 11:

#include <iostream> 

std::string addCommas(int n) 
{ 
    std::string s = std::to_string(n); 
    if (s.size() < 4) return s; 
    else 
    { 
     std::string tack_on = "," + s.substr(s.size() - 3, s.size()); 
     return addCommas(n/1000) + tack_on; 
    } 
} 

你只需要爲最小變動C++ 03/stringstream的版本:

#include <sstream> 

std::ostringstream oss; 

std::string addCommas(int n) 
{ 
    oss.str(""); // to avoid std::bad_alloc 
    oss << n; 
    std::string s = oss.str(); 
    // etc 
} 

測試:

int main() 
{ 
    std::cout << addCommas(1) << "\n"; 
    std::cout << addCommas(10) << "\n"; 
    std::cout << addCommas(100) << "\n"; 
    std::cout << addCommas(1000) << "\n"; 
    std::cout << addCommas(10000) << "\n"; 
    std::cout << addCommas(100000) << "\n"; 
    std::cout << addCommas(1000000) << "\n"; 
    return 0; 
} 

輸出:

1 
10 
100 
1,000 
10,000 
100,000 
1,000,000 
+0

考慮到這是一個初學者assigment我認爲s.substr(s.size() - 3,s.size())有點聰明;) – uncletall

+0

@uncletall這是從他的代碼。 「大小」和「長度」是相同的。 – 2014-02-28 08:39:05

+0

你是對的......這就是爲什麼我不明白他在做什麼(+1) – uncletall

1

我覺得這個人是有點簡單而且更容易理解:

std::string commas(int n) 
{ 
    std::string s = std::to_string(n%1000); 
    if ((n/1000) == 0) return s; 
    else 
    { 
     // Add zeros if required 
     while(s.size() < 3) 
     { 
      s = "0" + s; 
     } 
     return commas(n/1000) + "," + s; 
    } 
} 
0

沒有遞歸的另一種方法:

class Grouping3 : public std::numpunct<char> 
{ 
protected: 
    std::string do_grouping() const { return "\003"; } 
}; 

std::string commas(int n) 
{ 
    std::ostringstream converted; 
    converted.imbue(std::locale(converted.getloc(), new Grouping3)); 
    converted << n; 
    return converted.str(); 
} 

需要#include <locale>在一些環境

作業可能的解決方案可能是:

std::string commas(std::string&& str) 
{ 
    return str.length() > 3? 
     commas(str.substr(0, str.length()-3)) + "," + str.substr(str.length()-3): 
     str; 
} 
std::string commas(int n) 
{ 
    std::ostringstream converted; 
    converted << n; 
    return commas(converted.str()); 
} 
+0

這個任務是使用遞歸,而不是使用區域設置 – uncletall

+0

它不應該是一個賦值的解決方案,它應該是一個沒有遞歸的替代方法;-) –

+0

我在答案中爲作業添加了一個可能的解決方案 –

相關問題