N个字符串排列(重复)

时间:2018-01-31 17:23:44

标签: c string permutation

我必须首先打印n个排列,重复一个字符串。

字符串由字符组成' a'''''' d''' e&# 39;,' F'

例如,前10个排列将是:aaaaaa,aaaaab,aaaaac,aaaaad,aaaaae,aaaaaf,aaaaba,aaaabb,aaaabc,aaaabd。

这是我失败的尝试:

int main()
{    
  FILE *c;
  c = fopen("C:\\Users\\Korisnik\\Desktop\\tekst\\permutacija.txt", "w");
  char s[6] = "abcdef";
  char t[6] = "aaaaaa";
  s[6] = '\0';
  t[6] = '\0';
  int k = strlen(t);
  int m = k;
  int n;
  scanf("%d", &n);
  int br = 0;
  int i = 0;

  while (br < n) {
    i = 0;

    while (i < 6) {
      t[k-1] = s[i];
      fprintf(c, "%s ", t);
      fprintf(c, "\n");
      i++;
      br++;

      if (br == n) {
        exit(1);
      }
    }

    t[k-1] = 'a';
    k--;

    if (k < 0) {
      k = m;
    }
  }

  return 0;
}

前10个排列的输出是: AAAAA AAAAAB aaaaac aaaaad aaaaae aaaaaf AAAA aaaaba aaaaca aaaada

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

(显示不同的想法)如果你仔细观察,你会发现所有的排列都是基数为7的数字。将a视为0b视为1,依此类推。因此,对于每个号码1..n,您都会将其转换为基础7并编写它(通过写我的意思,代替0您放置a,{{1} } - 1等)。这将为您提供所需的结果。 (在转换中,您必须根据要显示的位数在数字的左侧附加b)。您的代码中存在问题:

0

在C中是合法的。

char s[6]="abcdef";

这不是因为您正在访问未定义行为的数组索引。 s[6]=0; 是未定义的行为,因为strlen(t)未终止NUL。

您的代码中也有t - 这也会导致未定义的行为,它还需要fprintf(c,"%s ",t);指向nul终止的char*数组。这将让你意识到拥有这样的东西是多么无关紧要

char

长话短说,请使用char s[6]="abcdef"; (同样适用于char s[7]="abcdef";)。