1. 项目概述
"组合不重复的3位数"是一个经典的编程练习题,主要考察对排列组合概念的理解以及基础编程能力的掌握。这个问题的核心要求是:用给定的数字(通常是1-9)组合出所有可能的3位数,且每个数字在同一个3位数中不能重复出现。
在实际编程面试和算法练习中,这类问题经常作为入门级的考核题目。它不仅能够检验程序员对循环和条件判断的掌握程度,还能考察对问题分解和算法优化的思考能力。对于C/C++开发者来说,这是一个很好的练习指针、数组和基本算法思维的机会。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与算法设计
2.1 问题分解
要解决这个问题,我们需要明确几个关键点:
- 数字范围:通常使用1-9的数字(0一般不包括在内,因为三位数的首位不能为0)
- 不重复:每个数字在同一个三位数中只能出现一次
- 所有组合:需要穷举所有可能的有效组合
2.2 基本算法思路
最直观的解决方法是使用三重循环:
- 第一层循环控制百位数(1-9)
- 第二层循环控制十位数(0-9),但要排除百位数已经使用的数字
- 第三层循环控制个位数(0-9),但要排除百位和十位已经使用的数字
这种方法的时间复杂度是O(n³),对于这个特定问题来说效率已经足够,因为n的最大值是9。
2.3 优化思路
虽然三重循环已经足够解决这个问题,但我们还可以考虑一些优化:
- 使用位运算来记录已使用的数字,可以加快重复检查的速度
- 如果只需要计数而不需要输出所有组合,可以使用排列组合公式直接计算总数
- 可以考虑递归实现,使代码更加简洁
3. C/C++实现详解
3.1 基础三重循环实现
cpp复制#include <stdio.h>
int main() {
int count = 0;
for (int i = 1; i <= 9; i++) { // 百位
for (int j = 0; j <= 9; j++) { // 十位
if (j == i) continue; // 跳过重复数字
for (int k = 0; k <= 9; k++) { // 个位
if (
