我必须首先打印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
有什么建议吗?
答案 0 :(得分:1)
(显示不同的想法)如果你仔细观察,你会发现所有的排列都是基数为7的数字。将a
视为0
,b
视为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";
)。