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. 通用化修改:如果需要处理更多数字或不同长度的数字,可以将代码参数化:

总结

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

相关推荐
1024奇点8 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch9 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL9 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0310 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
蹊黎10 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
by2099910 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮11 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻11 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble11 小时前
C++ 用互斥锁实现读写锁
开发语言·c++