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

How to add commas to a string using recursion

本文关键字:添加 字符串 何使用 递归      更新时间:2023-10-16

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

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

任何帮助将不胜感激!

算法相当简单。它与您的解决方案非常相似,只是我添加了递归所需的部分。要了解其工作原理,请删除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/字符串流版本进行最少的更改:

#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

我认为这个更简单,更容易遵循:

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;
    }
}
一种

没有递归的替代方法:

class Grouping3 : public std::numpunct< char >
{
protected:
    std::string do_grouping() const { return "03"; }
};
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() );
}