C语言经典100题---例001---组无重复数字的数

题目

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 个互不相同且无重复数字的三位数。

扩展思考

  1. 时间复杂度:三重循环,复杂度为O(n³),n=4,总共64次循环,其中24次满足条件

  2. 优化方案:可以使用回溯算法或递归实现,特别是当数字范围较大时效率更高

  3. 通用化修改:如果需要处理更多数字或不同长度的数字,可以将代码参数化:

总结

这道题是经典的排列组合问题,通过三重循环和条件判断可以简单高效地解决。虽然对于大数字范围不是最优解,但对于小范围问题完全足够,且代码清晰易懂。

相关推荐
头发够用的程序员7 小时前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
夜猫逐梦7 小时前
【逆向经验】一篇文章讲透为什么CE搜不到Python游戏的内存值
开发语言·python·游戏
SilentSamsara8 小时前
闭包的本质:Python 如何捕获自由变量
开发语言·python·青少年编程·pycharm
十五年专注C++开发8 小时前
浅谈LLVM
开发语言·c++·qt·clang·llvm
白夜11178 小时前
C++(标签派发 Tag Dispatching)
开发语言·c++·笔记·算法
CSCN新手听安9 小时前
【Qt】Qt窗口(六)QMessageBox消息对话框的使用
开发语言·c++·qt
会编程的土豆9 小时前
由c/c++速通go语言,新手必看
c语言·c++·golang
CDN3609 小时前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python
froginwe119 小时前
jQuery 添加元素
开发语言
zhangfeng11339 小时前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php