C语言经典100例 题目:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是1、2、3、4,组成所有的排列后再去掉不满足条件的排列。
时间: 2024-10-23 22:03:46 浏览: 23
这是一个经典的组合问题,可以使用递归或循环的方式来解决。在C语言中,你可以通过遍历每个可能的数字作为百位,然后对剩下的三个数字进行类似的操作来生成所有可能的三位数。以下是简单的程序思路:
```c
#include <stdio.h>
// 用于存储结果的数组
int result[4][4][4];
int countTrailingZeros(int n) {
int zeros = 0;
while (n % 10 == 0) {
zeros++;
n /= 10;
}
return zeros;
}
void generateNumbers(int start, int end, int current) {
// 如果当前已经到达个位,将结果存入数组并计算个零
if (current == 100) {
int zeros = countTrailingZeros(start);
if (zeros == 0) { // 只考虑非零三位数
result[start / 10][start % 10][end] = 1; // 去掉重复的数字顺序
}
return;
}
// 依次尝试每个可能的下一个数字
for (int i = start; i <= end; ++i) {
generateNumbers(i + 1, end, current * 10 + i);
}
}
int main() {
int total = 0;
generateNumbers(1, 4, 0); // 百位开始,个位结束
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
for (int k = 0; k < 4; ++k) {
total += result[i][j][k]; // 累加计数
}
}
}
printf("共有 %d 个互不相同且无重复数字的三位数:\n", total);
// 打印每个三位数
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
for (int k = 0; k < 4; ++k) {
if (result[i][j][k]) {
printf("%d%d%d\n", i*100 + j*10 + k);
}
}
}
}
return 0;
}
```
阅读全文