题目
C 练习实例001 - 组无重复数字的数 题目:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
题目分析
题目要求用数字1、2、3、4组成互不相同且无重复数字的三位数。
这是一个排列问题,相当于从4个数字中选3个进行排列,计算排列的个数并列出所有可能。
数学计算:
-
百位:4种选择(1,2,3,4)
-
十位:3种选择(不能和百位重复)
-
个位:2种选择(不能和百位、十位重复)
-
总数:4 × 3 × 2 = 24个
C语言代码实现
cpp
#include <stdio.h>
int main()
{
int i, j, k; // i-百位,j-十位,k-个位
int count = 0; // 计数器
printf("由1、2、3、4组成的所有互不相同且无重复数字的三位数:\n");
// 三重循环生成所有可能的组合
for (i = 1; i <= 4; i++) // 百位数字
{
for (j = 1; j <= 4; j++) // 十位数字
{
for (k = 1; k <= 4; k++) // 个位数字
{
// 判断三个数字是否互不相同
if (i != j && i != k && j != k)
{
printf("%d%d%d ", i, j, k);
count++;
// 每行显示6个数字,便于查看
if (count % 6 == 0)
{
printf("\n");
}
}
}
}
}
printf("\n\n总共可以组成 %d 个互不相同且无重复数字的三位数。\n", count);
return 0;
}
代码详细分析
变量说明:
-
i:百位数字(1-4) -
j:十位数字(1-4) -
k:个位数字(1-4) -
count:计数器,记录符合条件的数字个数
循环结构:
-
三层嵌套循环,每层循环1-4,生成所有可能的数字组合
-
最外层循环控制百位,中间层控制十位,最内层控制个位
条件判断:
-
if(i != j && i != k && j != k):确保三个位置的数字互不相同 -
这是关键条件,排除重复数字的组合
输出格式化:
-
每行显示6个数字,提高可读性
-
最后输出总个数
程序运行结果
cpp
由1、2、3、4组成的所有互不相同且无重复数字的三位数:
123 124 132 134 142 143
213 214 231 234 241 243
312 314 321 324 341 342
412 413 421 423 431 432
总共可以组成 24 个互不相同且无重复数字的三位数。
扩展思考
-
时间复杂度:三重循环,复杂度为O(n³),n=4,总共64次循环,其中24次满足条件
-
优化方案:可以使用回溯算法或递归实现,特别是当数字范围较大时效率更高
-
通用化修改:如果需要处理更多数字或不同长度的数字,可以将代码参数化:
总结
这道题是经典的排列组合问题,通过三重循环和条件判断可以简单高效地解决。虽然对于大数字范围不是最优解,但对于小范围问题完全足够,且代码清晰易懂。