蓝桥杯15届省赛“好数“题解

以下是完整的代码

#include <stdio.h>
int main()
{
    int n, count = 0;
    scanf("%d", &n);

    for (int num = 1; num <= n; num++) {
        int m = num, is_good = 1, pos = 1; // 初始化变量
        while (m > 0) {
            int digit = m % 10; // 获取当前位数字
            if ((pos % 2 == 1 && digit % 2 != 1) || // 奇数位数字不是奇数
                (pos % 2 == 0 && digit % 2 != 0)) { // 偶数位数字不是偶数
                is_good = 0;
                break;
            }
            m /= 10; // 移除最低位
            pos++;   // 位置前移
        }
        if (is_good) count++; // 如果是好数,计数加1
    }

    printf("%d\n", count);
    return 0;
}
1. 变量声明与输入
int n, i = 0;
scanf("%d", &n);
  • 声明变量:
    • n: 表示输入的上限整数。
    • i: 计数器,用来统计满足“好数”条件的数字个数。初始化为 0。
  • 读取用户输入的整数 n

2. 遍历从 1 到 n 的每个数字

for (int num = 1; num <= n; num++) {
    ...
}
  • 使用 for 循环,从 1 遍历到 n,逐一判断每个数字是否为“好数”。
  • 当前被判断的数字用变量 num 表示。

3. 初始化数字处理的辅助变量

int m = num;
int pos = 1;
int is_good = 1;
  • m: 复制 num 的值,用来逐位提取数字(因为 num 在后续处理中不能被破坏)。
  • pos: 位次标记,初始为 1(表示个位)。
  • is_good: 标志变量,用来记录当前数字是否满足“好数”条件:
    • 初始值为 1(表示当前数字暂时被认为是“好数”)。
    • 如果在判断中发现不满足条件,将其设置为 0

4. 判断数字是否为“好数”

while (m > 0) {
    int digit = m % 10; // 取当前最低位数字
    if ((pos % 2 == 1 && digit % 2 != 1) || // 奇数位不是奇数
        (pos % 2 == 0 && digit % 2 != 0)) { // 偶数位不是偶数
        is_good = 0; // 标记为非好数
        break; // 提前终止判断
    }
    m /= 10; // 移除当前最低位
    pos++; // 位次递增
}
  • 逐位处理数字:

    • m % 10: 提取数字 m 的最低位(个位)。
    • m /= 10: 从右到左逐位移除最低位。
    • pos++: 递增位次标记,用于判断当前数字是奇数位还是偶数位。
  • 条件判断:

    • (pos % 2 == 1 && digit % 2 != 1):
      • 如果当前位是 奇数位 且数字不是 奇数,说明不符合“好数”条件。
    • (pos % 2 == 0 && digit % 2 != 0):
      • 如果当前位是 偶数位 且数字不是 偶数,说明不符合“好数”条件。
    • 如果上述任一条件成立,则:
      • is_good 设置为 0,表示当前数字不是“好数”。
      • 使用 break 终止 while 循环,节省后续无用计算。

5. 更新计数器

if (is_good) i++;
  • 如果 is_good 的值仍然是 1,说明数字 num 满足“好数”条件,计数器 i 增加 1。

6. 输出结果

printf("%d\n", i);
  • 最后输出 i,即从 1 到 n 中满足“好数”条件的数字总数。

核心逻辑总结

  1. 遍历每个数字,从右到左提取每一位数字。
  2. 判断当前位次是奇数位还是偶数位:
    • 奇数位要求数字是奇数;
    • 偶数位要求数字是偶数。
  3. 如果某一位不符合条件,提前退出循环。
  4. 符合条件的数字计数器增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值