以下是完整的代码
#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
中满足“好数”条件的数字总数。
核心逻辑总结
- 遍历每个数字,从右到左提取每一位数字。
- 判断当前位次是奇数位还是偶数位:
- 奇数位要求数字是奇数;
- 偶数位要求数字是偶数。
- 如果某一位不符合条件,提前退出循环。
- 符合条件的数字计数器增加。