如何使用递归向字符串添加逗号
How to add commas to a string using 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());
}
}
任何帮助将不胜感激!
算法相当简单。它与您的解决方案非常相似,只是我添加了递归所需的部分。要了解其工作原理,请删除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() );
}
相关文章:
- 重载加法运算符(使用函数向对象添加字符串)
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- 添加字符串和文字(C++)
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 添加字符串向量和不同数据类型向量的映射
- 在链接列表中添加字符串的简单方法
- 列表框中的添加字符串 (MFC)
- 添加字符串和文字,顺序如何影响是否可以正确添加字符串
- 向矢量集添加字符串时出现问题<string><>
- 在C++中添加字符串和文字时出现问题
- free():添加字符串时指针无效
- 为什么通过添加字符串文字和char初始化时,为什么不打印字符串
- 矢量尝试添加字符串时会崩溃
- 在数组 C++ 中添加字符串
- 如何添加字符串
- 从向量中删除和添加字符串
- 添加字符串和列表到c++中的映射
- 添加字符串变量后的两个不同的双值
- 为什么我的非所有者绘制的列表框在添加字符串后会出现绘图问题
- 当试图向结构中添加字符串时,程序中断