如何使用递归将逗号添加到字符串

时间:2014-02-28 07:42:37

标签: c++ string recursion

我是编程的初学者。我正在编写学校作业,并要求我使用递归将逗号添加到字符串中。我已经完成了大部分工作但是当我输入一个大于一百万的数字时,它不会在第一个数字之前添加逗号。这就是我到目前为止所做的:

// 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());
    }
}   

非常感谢任何帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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() );
}