我是编程的初学者。我正在编写学校作业,并要求我使用递归将逗号添加到字符串中。我已经完成了大部分工作但是当我输入一个大于一百万的数字时,它不会在第一个数字之前添加逗号。这就是我到目前为止所做的:
// 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());
}
}
非常感谢任何帮助!
答案 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() );
}