我有一个函数void numbers(ostream& outs, const string& prefix, unsigned int levels);
,可以将输出打印到ostream出口。
输出包含字符串前缀,后跟1.1。,1.2。,1.3。等形式的“section numbers”。 levels参数确定节号码的级别。例如,如果级别为2,则节号的格式为x.y.如果级别为3,则节号的格式为x.y.z.每个级别允许的数字始终为“1”到“9”。例如,如果前缀是字符串“THERBLIG”且级别为2,则该函数将通过打印开始:
THERBLIG1.1。
THERBLIG1.2。
THERBLIG1.3。
并以打印结束:
THERBLIG9.7。
THERBLIG9.8。
THERBLIG9.9。
当等级达到零时发生停止案例(在这种情况下,前缀自己打印一次,然后没有其他内容)。
我的当前代码在level为2时正确打印出所有部分,但是当level为3时则不然。如何使我的代码更具动态性和通用性,以便它可以将任何数字作为级别? (当等级为3时,输出应为1.1.1,1.1.2,1.1.3 ...... 1.2.1 ..)。
这是我的代码:
void numbers(ostream& outs, const string& prefix, unsigned int levels){
if (levels > 1){
for (int i = 1; i <= 9; i++){
for (int k = 1; k <= 9; k++){
string s = prefix + char('0' + i);
s += '.';
s += char('0' + k);
s += '.';
outs<<s<<endl;
}
}
numbers(outs, prefix, levels - 1);
}
else{
levels = 0;
if (levels == 0){
cout<<prefix<<endl;
}
}
}
答案 0 :(得分:2)
我建议使用回溯:
#include <iostream>
#include <string>
using namespace std;
void numbers(ostream& outs, const string& prefix, unsigned int levels){
if (levels == 0) {
outs << prefix << endl;
return;
}
for (int i = 1; i <= 9; i++){
string dot = (levels == 1 ? "" : "."); //handle the case the lowest level
string s = prefix + std::to_string(i) + dot;
numbers(outs, s, levels - 1);
}
}
int main() {
int level = 3;
numbers(cout, "", level);
return 0;
}
答案 1 :(得分:0)
试试这个
#include <iostream>
#include <string>
using namespace std;
void numbers(string& outs, const string& prefix, unsigned int levels){
if (levels >= 1){
for (int k = 1; k <= 9; k++){
string tmpOut = outs + char('0' + k) + ".";
numbers(tmpOut, prefix, levels - 1);
}
}
else{
outs.erase(outs.size() - 1, 1);
cout<<prefix<< outs << endl;
}
}
int main()
{
string out;
numbers(out, "prefex ", 2);
numbers(out, "prefex ", 3);
return 0;
}
稍后我会描述它