问题描述
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。
给定一个正整数 NN,请计算从 1 到 NN 一共有多少个好数。
输入格式
一个整数 NN。
输出格式
一个整数代表答案。
样例输入 1
24
样例输出 1
7
样例输入 2
2024
样例输出 2
150
样例说明
对于第一个样例,2424 以内的好数有 11、33、55、77、99、2121、2323,一共 77 个。
评测用例规模与约定
对于 10%10% 的评测用例,1≤N≤1001≤N≤100 。
对于 100%100% 的评测用例,1≤N≤1071≤N≤107 。
代码展示
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
int counts=0;
for(int i=1;i<=N;i++){
int num=i;
int pos=1;
bool vaild=true;
while(num>0){
int digit=num%10;
if(pos%2==1){
if(digit%2!=1){
vaild=false;
}
}else{
if(digit%2!=0){
vaild=false;
}
}
num/=10;
pos++;
}
if(vaild){
counts++;
}
}
cout<<counts;
// 请在此输入您的代码
return 0;
}
代码逐句解析
这段代码的功能是计算从1到N(包括N)之间满足特定条件的数字的数量。具体来说,这些数字的奇数位上的数字必须是奇数,偶数位上的数字必须是偶数。下面逐句解释这段代码:
#include <iostream>
using namespace std;
#include <iostream>
:包含输入输出流的标准库,以便使用cin
和cout
。using namespace std;
:声明使用标准命名空间,这样可以不用在每个来自标准库的函数或对象前加上std::
。
int main()
{
- 定义程序的主入口点
main()
函数,程序从此处开始执行。
int N;
cin >> N;
- 声明一个整型变量
N
用于存储用户输入的最大范围值。 - 使用
cin
从标准输入读取一个整数并存储到N
中。
int counts = 0;
- 声明一个计数器变量
counts
并初始化为0,用于记录符合条件的数字数量。
for(int i = 1; i <= N; i++){
- 开始一个循环,变量
i
从1开始,每次递增1,直到超过N
为止。这个循环用于遍历从1到N
的所有数字。
int num = i;
int pos = 1;
bool vaild = true;
- 在循环内部,首先将当前数字
i
赋值给num
,然后初始化位置计数器pos
为1,并设置布尔变量vaild
为true
表示当前数字暂时认为是有效的。
while(num > 0){
int digit = num % 10;
- 开始一个
while
循环,当num
大于0时继续循环。此循环用于处理数字num
的每一位数字。 - 计算当前最低位的数字
digit
,通过num % 10
实现。
if(pos % 2 == 1){
if(digit % 2 != 1){
vaild = false;
}
}else{
if(digit % 2 != 0){
vaild = false;
}
}
- 检查当前位置
pos
是否为奇数位(pos % 2 == 1
),如果是,则检查当前位的数字是否为奇数;如果不是奇数,则设置vaild
为false
。 - 如果当前位置是偶数位,则检查当前位的数字是否为偶数;如果不是偶数,则设置
vaild
为false
。
num /= 10;
pos++;
}
- 将
num
除以10去掉最低位,准备处理下一位数字。 - 位置计数器
pos
加1,指向下一个数字的位置。
if(vaild){
counts++;
}
- 循环结束后,如果
vaild
仍为true
,则表示该数字符合所有条件,增加计数器counts
。
cout << counts;
- 循环结束后,输出符合条件的数字总数
counts
。
return 0;
}