题目描述
一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。
给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
输入格式
一个整数 N。
输入输出样例
输入 #1复制
24
输出 #1复制
7
输入 #2复制
2024
输出 #2复制
150
说明/提示
样例 1 解释
24 以内的好数有 1,3,5,7,9,21,23,一共 7 个。
数据规模与约定
- 对于 10% 的测试数据,1≤N≤100。
- 对于全部的测试数据,1≤N≤107。
-
#include <bits/stdc++.h> using namespace std; int n; // 输入的n,表示需要统计1~n中的“好数” // 判断一个数是否为“好数” bool goodnum(int num) { int posi = 1; // 数位位置(从最低位开始计数,最低位为第1位) int t; // 当前位的数字 while (num > 0) { t = num % 10; // 取当前最低位的数字 // 问题根源:这里从最低位开始判断,但题目要求的是从左到右的奇数位和偶数位 // 例如数字123的“第一位”是1(左起),但代码中处理顺序是3(posi=1)、2(posi=2)、1(posi=3) // 奇数位(posi为1,3,5...)必须是奇数 if (posi % 2 == 1) { if (t % 2 == 0) { // 如果当前位是偶数,则不符合要求 return false; } } // 偶数位(posi为2,4,6...)必须是偶数 else { if (t % 2 == 1) { // 如果当前位是奇数,则不符合要求 return false; } } num /= 10; // 移除最低位 posi++; // 数位位置递增 } return true; // 所有位都符合要求 } int main() { int cnt = 0; // 统计“好数”的数量 cin >> n; // 遍历1~n,逐个判断是否为“好数” for (int i = 1; i <= n; i++) { if (goodnum(i)) { cnt++; } } cout << cnt << endl; return 0; }