C程序打印3个字母组合

时间:2014-03-10 05:59:55

标签: c

我想打印任意3个字母的组合而不使用C编程中的嵌套for循环?

以下是3个字母“ABC”组合的代码。 我可以使用3 for循环执行程序。 但我不想那样。我想通过一个for循环和非递归的方式来做它。但我没有得到任何逻辑。

#include <stdio.h>
#include <stdlib.h>

int main()
{

    int i=0,j=0;
    char b[10],a[] = "ABC";
    strcpy(b,a);
    while(i < 3)
    {
        b[j]=a[i];

        if(i==0)
        {
            b[j+1]=a[i+1];
            b[j+2]=a[i+2];
            printf("\n%s",b);

            b[j+1]=a[i+2];
            b[j+2]=a[i+1];
            printf("\n%s",b);

        }else if(i==1)
        {
            b[j+1]=a[i+1];
            b[j+2]=a[i-1];
            printf("\n%s",b);

            b[j+1]=a[i-1];
            b[j+2]=a[i+1];
            printf("\n%s",b);

        }else
        {
            b[j+1]=a[i-1];
            b[j+2]=a[i-2];
            printf("\n%s",b);

            b[j+1]=a[i-2];
            b[j+2]=a[i-1];
            printf("\n%s",b);
        }

        i++;

    }

    getch();
    return 0;
}

2 个答案:

答案 0 :(得分:1)

如果您知道它总是长度为3,您可以使用预生成来最小化复杂性和/或代码。预生成是将复杂计算从运行时间移动到编译时甚至是之前的行为,对于复杂的计算来说,它可以非常高效。

一个例子(虽然有点人为)是编写一个程序来计算所有可能的无符号64位阶乘(其中只有大约九十个)然后让该程序生成源代码(查找表和函数)可以执行查找以获取它们。在编译将使用它的程序之前,生成表的复杂性是一次

这意味着程序中使用它的因子操作 从可能耗时的一系列乘法变为更类似于一次乘法和加法(表查找)。 / p>

将相同的方法应用于排列(虽然查找表的生成是在我脑海中完成的,因为它并不复杂)会给你这样的代码:

#include <stdio.h>

// The permutations.

static int perm3[] = { 0,1,2,  0,2,1,
                       1,0,2,  1,2,0,
                       2,0,1,  2,1,0 };

int main (void) {
    int i;
    char x[] = {'a', 'b', 'c'};

    // Permute using the table to get indexes.

    for (i = 0; i < sizeof(perm3) / sizeof(perm3[0]); i += 3)
        printf ("%c %c %c\n", x[perm3[i]], x[perm3[i+1]], x[perm3[i+2]]);

    return 0;
}

现在,有些人可能会认为&#34;作弊&#34;但我在这里说实话,你能写的一些最快的程序会以这种方式作弊: - )

答案 1 :(得分:0)

您要问的问题是基于算法概念Backtracking

这是函数

void permute(char *a, int i, int n) 
{
   int j; 
   if (i == n)
     printf("%s\n", a);
   else
   {
        for (j = i; j <= n; j++)
       {
          swap((a+i), (a+j));
          permute(a, i+1, n);
          swap((a+i), (a+j)); //backtrack
       }
   }
}

main()

拨打此电话
int main()
{
   char a[] = "ABC";  
   permute(a, 0, 2);     // first param is array,2nd is starting index and 3rd is ending index

   return 0;
}

Wolfram alpha在这类问题背后有数学概念。基本上我们逐个尝试所有解决方案,然后通过将这些更改恢复为原始解决方案来回溯,然后再次尝试不同的解决方案。要清楚地了解这一点。 http://mathworld.wolfram.com/Permutation.html