有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用C语言写三种方法
时间: 2023-02-22 16:33:27 浏览: 224
共有 4 x 3 x 2 = 24 个三位数。
下面是三种用 C 语言写的方法:
1. 暴力枚举:
```
#include <stdio.h>
int main() {
int i, j, k, count = 0;
for (i = 1; i <= 4; i++) {
for (j = 1; j <= 4; j++) {
for (k = 1; k <= 4; k++) {
if (i != j && j != k && i != k) {
printf("%d%d%d\n", i, j, k);
count++;
}
}
}
}
printf("count = %d\n", count);
return 0;
}
```
2. 用全排列算法:
```
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void perm(int list[], int k, int m) {
int i;
if (k == m) {
printf("%d%d%d\n", list[0], list[1], list[2]);
} else {
for (i = k; i <= m; i++) {
swap(&list[k], &list[i]);
perm(list, k+1, m);
swap(&list[k], &list[i]);
}
}
}
int main() {
int list[3] = {1, 2, 3};
perm(list, 0, 2);
return 0;
}
```
3. 用非递归全排列算法:
```
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int list[3] = {1, 2, 3};
int i, j, k, m = 2;
while (1) {
printf("%d%d%d\n", list[0], list[1], list[2]);
for (i = m; i >= 0 && list[i] >= 4 - i; i--);
if (i < 0) break;
list[i]++;
for (j = i + 1; j <= m; j++) list[j] = list[i] + j - i;
}
return 0;
}
```
阅读全文