我是一名研究我自己的新手程序员。我试图制作一个程序,列出长度为12的所有字符串,例如字符来自a-z。但是,似乎有一个我能找到的错误。它输出例如The word is ).
任何人都可以告诉我我做错了什么,有没有更简单的方法来做这个程序?
#include <iostream>
#include <string>
int main(int argc, char *argv[])
{
using namespace std;
string l ("qwertyuiopasdfghjklzxcvbnm");
string test ("");
for(int i1 = 0;i1 < 26;++i1)
for(int i2 = 0;i2 < 26;++i2)
for(int i3 = 0;i3 < 26;++i3)
for(int i4 = 0;i4 < 26;++i4)
for(int i5 = 0;i5 < 26;++i5)
for(int i6 = 0;i6 < 26;++i6)
for(int i7 = 0;i7 < 26;++i7)
for(int i8 = 0;i8 < 26;++i8)
for(int i9 = 0;i9 < 26;++i9)
for(int i10 = 0;i10 < 26;++i10)
for(int i11 = 0;i11 < 26;++i11)
for(int i12 = 0;i12 < 26;++i12) {
test = l[i1]+l[i2]+l[i3]+l[i4]+l[i5]+l[i6]+l[i7]+l[i8]+l[i9]+l[i10]+l[i11]+l[i12];
cout << "The word is " << test << "." << endl;
test = "";
}
return 0;
}
答案 0 :(得分:4)
l[i1]+l[i2]
将无法满足您的期望。您正在添加两个char
类型的表达式,因此您将获得int
类型的结果。
一个简单的解决方法是:
test = std::string() + l[i1]+l[i2]+l[i3]+l[i4]+l[i5]+l[i6]+l[i7]+l[i8]+l[i9]+l[i10]+l[i11]+l[i12];
答案 1 :(得分:1)
正如我在评论中提到的,当你看到这样的排列问题时,你应该考虑如何编写递归算法。
在这种情况下,问问自己每个步骤(级别)的样子。好吧,你得到的字符串直到那一点,你需要遍历字母,你需要每次调用下一级,以便它可以继续这个过程。
将其解析为代码,“给定字符串到达此点”意味着您的递归函数在前缀字符串中传递,并且数字指示它在链中的位置:
void print_all_strings(const std::string& prefix, unsigned remain) {
迭代字母是你已经得到的东西(使用for
循环),但你做的方式不是很好。不要将所有字符键入字符串并迭代这些字符,最好不要意识到可以在for
循环中迭代字符,就像可以遍历数字一样,因为字符是C ++中的数字(和C)。换句话说,'a' + 1 == 'b'
等等。所以你的循环变成了:
for(char c = 'a'; c <= 'z'; c++)
最后,您需要处理下一级别。这意味着使用prefix
和remain
参数来确定下一步该做什么。好吧,有一件事我们知道:如果剩下0个字母,那么不要添加一个字母,而是打印字符串并返回!
if(remain == 0) {
cout << "The word is " << prefix << "." << endl;
return;
}
在其他情况下,我们需要添加一封信。这就是std::string + char => std::string
的用武之地。(注意char + char => char
!)
print_all_strings(prefix + c, remain - 1);
全部放在一起:
void print_all_strings(const std::string& prefix, unsigned remain) {
if(remain == 0) {
cout << "The word is " << prefix << "." << endl;
return;
}
for(char c = 'a'; c <= 'z'; c++)
print_all_strings(prefix + c, remain - 1);
}
int main(int argc, char *argv[])
{
print_all_strings("", 12);
return 0;
}
但是,正如CiaPan解释的那样,你的电脑会在这个节目结束前消失。