所以我有一个用C语言编写的作业问题,我在过去5个小时中一直在努力,但无法弄清楚出了什么问题。
问题陈述:
将n作为1到9之间的数字,并打印所有可能形成的数字,而无需重复数字。对于如果n = 3,则数字为1,2,3,数字为123、132、231、213、321、312。
输入:2输出:12、21
输入:3输出:123、132、231、213、321、312
这是我到目前为止所做的:
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 10
void print(int *num, int n)
{
int i;
for ( i = 0 ; i < n ; i++){
printf("%d", num[i]);
}
printf("\n");
}
int main()
{
int num[N];
int temp;
int i, n, j,k;
printf("\nNo of digits? : ");
scanf("%d", &n);
for(k=0; k<n; k++){
num[k] = k + 1;
}
for (j = 1; j <= n; j++) {
for (i = 0; i < n-1; i++) {
temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
print(num, n);
}
}
return 0;
}
我得到的数字预期达到3。 但是从4开始,它并没有显示出所有的数字排列。
No of digits? : 4
2134
2314
2341
3241
3421
3412
4312
4132
4123
1423
1243
1234
在设置计数器直到 n!数组将不在索引范围内。
那么如何正确计算所有排列?
答案 0 :(得分:1)
我想念什么?
对n个元素进行排序的可能性为$cut = 3;
$text = explode('.', 'no.this.is.just.example');
echo implode('.', array_slice($text, 0, $cut));
// outputs no.this.is
,您的两个紧密的 for 无法为任何 n 值计算factorial(n)
,因此它们找不到所有订单。
可能的解决方案是:
factorial(n)
2:
#include <stdio.h>
/* current is the number under fabrication
max is the max number of digit and also the max digit to use
n is the number of digits to add to current
used[n] is 0 if the digit n is not yet used, else 1 */
void permut(unsigned current, unsigned max, unsigned n, int used[])
{
if (n == 0)
printf("%d\n", current);
else {
unsigned i;
for (i = 1; i <= max; ++i) {
if (!used[i]) {
used[i] = 1;
permut(current*10 + i, max, n - 1, used);
used[i] = 0;
}
}
}
}
int main()
{
unsigned n;
int used[10] = { 0 }; /* used[n] is 0 if the digit n is not yet used */
printf("No of digits? : ");
if ((scanf("%u", &n) != 1) || (n == 0) || (n > 9))
return 0;
permut(0, n, n, used);
return 0;
}
3:
12
21
4:
123
132
213
231
312
321