当前位置: 首页 > article >正文

蓝桥杯C语言组:进制与整除问题

蓝桥杯C语言中的“进制与整除”问题详解

目录

 

1. 天平秤重

2. 尼姆堆

3. 公约公倍

4. 有理数

5. 一步之遥


在蓝桥杯编程竞赛中,“进制与整除”问题是一类非常重要的题目类型。这类问题涉及到数论、组合数学和算法设计等多个领域的知识,能够很好地考察参赛者的逻辑思维能力和编程技巧。本文将详细探讨五个与“进制与整除”相关的经典问题:天平秤重、尼姆堆、公约公倍、有理数和一步之遥问题。每个问题都将从问题背景、解题思路、代码实现和运行结果示例四个方面进行详细说明。


1. 天平秤重

1.1 问题背景

天平秤重问题是一个经典的组合优化问题。假设我们有一组砝码,砝码的重量分别为1、3、9、27……(即3的幂次)。现在需要用这些砝码称出一个重量为n的物体,目标是找出最少需要几个砝码。

1.2 解题思路

  • 贪心算法:每次选择尽可能大的砝码,直到总重量达到或超过目标重量。

  • 3的幂次:砝码的重量是3的幂次,因此每次选择的砝码重量为3^k,其中k是满足3^k <= n的最大整数。

  • 逐步减重:每次选择一个砝码后,从目标重量中减去该砝码的重量,继续选择下一个最大的砝码,直到目标重量为0。

1.3 代码实现

#include <stdio.h>

int main() {
    int n; // 目标重量
    printf("请输入物体的重量:");
    scanf("%d", &n);

    int count = 0; // 记录砝码数量
    while (n > 0) { // 当目标重量大于0时继续循环
        int weight = 1; // 当前砝码重量初始化为1
        while (weight * 3 <= n) { // 找到不超过目标重量的最大3的幂次砝码
            weight *= 3;
        }
        n -= weight; // 从目标重量中减去当前砝码重量
        count++; // 砝码数量加1
    }

    printf("最少需要%d个砝码\n", count); // 输出最少需要的砝码数量
    return 0;
}

1.4 运行结果示例

输入:

请输入物体的重量:10

输出:

最少需要3个砝码

1.5 表格说明

物体重量砝码重量砝码数量
101, 3, 93

2. 尼姆堆

2.1 问题背景

尼姆堆问题是一个经典的博弈论问题。假设我们有若干堆硬币,每堆硬币的数量分别为a1, a2, a3, ...。两名玩家轮流从某一堆中取走任意数量的硬币,取到最后一枚硬币的玩家获胜。问题是:先手玩家是否有必胜策略?

2.2 解题思路

  • 异或运算:尼姆堆问题的核心是利用异或运算来判断先手玩家是否有必胜策略。

  • 异或性质:如果所有堆的硬币数量的异或结果为0,则先手玩家必输;否则,先手玩家有必胜策略。

  • 计算策略:如果异或结果不为0,可以通过计算每堆硬币数量与异或结果的异或值,找到最优的取法。

2.3 代码实现

#include <stdio.h>

int main() {
    int a[] = {3, 4, 5}; // 三堆硬币的数量
    int sum = 0; // 用于存储所有堆的异或结果
    for (int i = 0; i < 3; i++) { // 遍历所有堆
        sum ^= a[i]; // 异或操作
    }

    if (sum == 0) { // 如果异或结果为0
        printf("先手必输\n");
    } else { // 如果异或结果不为0
        for (int i = 0; i < 3; i++) { // 遍历所有堆
            int x = sum ^ a[i]; // 计算每堆应剩下的数量
            if (x < a[i]) { // 如果计算结果小于当前堆的数量
                printf("让%d剩下%d可以赢\n", a[i], x); // 输出最优取法
            }
        }
    }

    return 0;
}

2.4 运行结果示例

输入:

无输入

输出:

让5剩下1可以赢

2.5 表格说明

堆数硬币数量
13
24
35

3. 公约公倍

3.1 问题背景

公约公倍问题涉及两个整数的最大公约数(GCD)和最小公倍数(LCM)。给定两个整数ab,要求计算它们的最大公约数和最小公倍数。

3.2 解题思路

  • 最大公约数(GCD):使用欧几里得算法(辗转相除法)计算两个数的最大公约数。

  • 最小公倍数(LCM):利用公式LCM(a, b) = (a * b) / GCD(a, b)计算最小公倍数。

3.3 代码实现

#include <stdio.h>

// 欧几里得算法计算最大公约数
int gcd(int a, int b) {
    while (b != 0) { // 当b不为0时继续循环
        int temp = b; // 临时变量存储b的值
        b = a % b; // b更新为a除以b的余数
        a = temp; // a更新为b的值
    }
    return a; // 返回最大公约数
}

// 计算最小公倍数
int lcm(int a, int b) {
    return (a * b) / gcd(a, b); // 利用公式计算最小公倍数
}

int main() {
    int a = 12, b = 18; // 示例输入
    printf("GCD of %d and %d is: %d\n", a, b, gcd(a, b)); // 输出最大公约数
    printf("LCM of %d and %d is: %d\n", a, b, lcm(a, b)); // 输出最小公倍数
    return 0;
}

3.4 运行结果示例

输入:

无输入

输出:

GCD of 12 and 18 is: 6
LCM of 12 and 18 is: 36

3.5 表格说明

abGCD(a, b)LCM(a, b)
1218636

4. 有理数

4.1 问题背景

有理数问题涉及分数的加法运算。给定两个有理数,要求计算它们的和,并化简结果。

4.2 解题思路

  • 分数加法:将两个分数的分子相加,分母相乘。

  • 化简分数:使用最大公约数(GCD)化简分数,确保结果是最简形式。

4.3 代码实现

#include <stdio.h>

// 欧几里得算法计算最大公约数
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b); // 递归计算最大公约数
}

int main() {
    int a1 = 1, b1 = 2; // 第一个有理数的分子和分母
    int a2 = 1, b2 = 3; // 第二个有理数的分子和分母

    int sum_a = a1 * b2 + a2 * b1; // 分子相加
    int sum_b = b1 * b2; // 分母相乘
    int common = gcd(sum_a, sum_b); // 求最大公约数

    printf("和为:%d/%d\n", sum_a / common, sum_b / common); // 输出化简后的结果
    return 0;
}

4.4 运行结果示例

输入:

无输入

输出:

和为:5/6

4.5 表格说明

分子1分母1分子2分母2和(分子)和(分母)
121356

5. 一步之遥

5.1 问题背景

一步之遥问题是一个简单的数学问题。给定一个正整数n,要求输出从1到n的所有整数中,与n的差的绝对值不超过1的数。

5.2 解题思路

  • 直接计算:只需要输出n-1nn+1即可。

  • 边界处理:如果n为1,则只输出1和2。

5.3 代码实现

#include <stdio.h>

int main() {
    int n; // 输入的正整数
    printf("请输入一个正整数:");
    scanf("%d", &n);

    printf("与%d的差的绝对值不超过1的数有:%d, %d, %d\n", n, n - 1, n, n + 1); // 输出结果
    return 0;
}

5.4 运行结果示例

输入:

请输入一个正整数:5

输出:

与5的差的绝对值不超过1的数有:4, 5, 6

5.5 表格说明

n结果
54, 5, 6

总结

本文详细探讨了蓝桥杯C语言中的五个“进制与整除”问题:天平秤重、尼姆堆、公约公倍、有理数和一步之遥问题。每个问题都从问题背景、解题思路、代码实现和运行结果示例四个方面进行了详细说明。通过这些内容,读者可以更好地理解这些问题的解题方法和实现过程。希望本文能够帮助参赛者更好地准备蓝桥杯竞赛,提升解题能力。



http://www.kler.cn/a/534835.html

相关文章:

  • 在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA
  • beyond the ‘PHYSICAL‘ memory limit.问题处理
  • Hackmyvm Blackhat
  • Deepseek v3R1 学习笔记
  • 基于Ceph14对接openstack的Nova、Glance、Cinder服务为后端存储
  • 【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】从计算机基础到HTML开发:Web开发的第一步
  • npm-npm ERR! missing script: serve
  • 深入探索 C++ 类型转换的奥秘
  • Conmi的正确答案——Rider中添加icon作为exe的图标
  • 使用java代码操作rabbitMQ收发消息
  • 管理etcd的存储空间配额
  • 汇编JCC条件跳转指令记忆
  • langchain教程-11.RAG管道/多轮对话RAG
  • DeepSeek让 Obsidian 更强大:Text generator与 Copilot 使用指南
  • 【LeetCode: 1004. 最大连续1的个数 III + 滑动窗口】
  • ?和.和*在正则表达式里面的区别
  • 探索进制转换的奥秘/西瓜杯
  • fast-lio代码解析(二)
  • PE/西瓜杯
  • Linux 环境安装 Elasticsearch 8
  • 每日一题——最小的K个数
  • 【蓝桥杯嵌入式】4_key:单击+长按+双击
  • 排序时间的复杂度和稳定性
  • 汽车免拆诊断案例 | 2015款奔驰R320车行驶中偶尔多个故障灯异常点亮
  • 游戏引擎学习第88天
  • DeepSeek背景下的知识库搭建指南