如何在C ++中列出长度为12的所有字符串?

时间:2015-04-17 14:44:06

标签: c++

我是一名研究我自己的新手程序员。我试图制作一个程序,列出长度为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;
}

2 个答案:

答案 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++)

最后,您需要处理下一级别。这意味着使用prefixremain参数来确定下一步该做什么。好吧,有一件事我们知道:如果剩下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解释的那样,你的电脑会在这个节目结束前消失。

相关问题