试题 C: 好数 时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分
【问题描述】 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上 的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称 之为“好数”。 给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
【输入格式】 一个整数 N。
【输出格式】 一个整数代表答案。
【样例输入 1】
24
【样例输出 1】
7
【样例输入 2】
2024
【样例输出 2】
150
【样例说明】 对于第一个样例,24 以内的好数有 1、3、5、7、9、21、23,一共 7 个。
【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ N ≤ 100。
对于 100% 的评测用例,1 ≤ N ≤ 107。
#include <iostream>
#include <string>
using namespace std;
int isGoodNumber(int num) {
int wei = 0; // 用于记录位数
int temp = num;
while (temp != 0) {
temp /= 10;
wei++;
}
temp = num; // 重置temp为原始数字,用于接下来的判断
int countOdd = 0; // 记录奇数位上奇数的个数
int countEven = 0; // 记录偶数位上偶数的个数
for (int i = 1; i <= wei; i++) {
int digit = temp % 10; // 获取当前最低位的数字
temp /= 10; // 去掉已经检查过的最低位
if (i % 2 != 0) { // 奇数位
if (digit % 2 != 0) { // 奇数
countOdd++;
} else {
return 0; // 奇数位上出现了偶数,直接返回0
}
} else { // 偶数位
if (digit % 2 == 0) { // 偶数
countEven++;
} else {
return 0; // 偶数位上出现了奇数,直接返回0
}
}
}
// 如果所有奇数位上的数字都是奇数,并且所有偶数位上的数字都是偶数,返回1
return countOdd == (wei + 1) / 2 && countEven == wei / 2;
}
int countGoodNumbers(int N) {
int count = 0;
int j=0;
for (int i = 1; i <= N; i++) {
j=isGoodNumber(i);
if (j==1) {
count++;
}
}
return count;
}
int main() {
int N;
cin >> N;
cout << countGoodNumbers(N) << endl;
return 0;
}