一、题目
问题描述
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。
输入格式
一个整数 NN。输出格式
一个整数代表答案。样例输入 1
24
样例输出 1
7
样例输入 2
2024
样例输出 2
150
样例说明
对于第一个样例,2424 以内的好数有 11、33、55、77、99、2121、2323,一共 77 个。评测用例规模与约定
对于 10%10% 的评测用例,1≤N≤100 1≤N≤100 。对于 100%100% 的评测用例,1≤N≤107 1≤N≤107 。
运行限制
语言 最大运行时间 最大运行内存
C++ 1s 256M
C 1s 256M
二、思路
我是看的答案后的思路:要计算从1-N共有多少个好数,我们可以遍历1-N,判断哪个是好数,是的计数器加一,最终输出好数的个数。
接着编写一个判断是否是好数的函数,注意返回bool类型,传入我们需要判断的数,我们从右向左便利每一位,奇数位是偶数返回false或者偶数位是奇数返回false,除此之外,返回true,则成功地判断是好数;
1.如何从左到右遍历每一位:循环的开始对10取余得到最低位(个位数),判断完后除10去掉最低位。
while(1){
int digit = n % 10;
//奇数位是偶数返回false或者偶数位是奇数返回false
digit /= 10;
}
2.如何判断奇数位是偶数或者偶数位是奇数:我们定义一个标记数(position)为1,标记数的奇偶代表位数的奇偶,每次循环结束后标记数+1,判断当前这轮循环的标记数为奇数,但是最低位为偶数,返回false,否则标记数为偶数,最低位为奇数,返回false。
if(position % 2 == 1){
if(digit % 2 == 0) return false;
}else {
if(digit % 2 == ) return false;
}
三、代码
#include<iostream>
//编写判断是否是好数的函数
//先看下面主函数
bool isGood(int n){
//我们拿到这个数,从个位开始判断,先把个位标记成1;
//判断是否奇数位,再判断奇数位上的数是否是奇数
//如果是奇数位为偶数返回false,如果偶数位是奇数也返回false
//标记数加1,此时标记数为2,代表百位,能被二整除
//再去掉最后一位数
//从个位开始标记
int position = 1;
//遍历n的每一位数
while(n > 0){
int digit = n % 10;
if(position % 2 == 1){
if(digit % 2 == 0) return false;
}else if(position % 2 == 0){
if(digit % 2 == 1) return false;
}
n /= 10;
position ++;
}
return true;
}
int main(){
//我们需要在主函数中输入这个数N,遍历从1-N的每一个数,来判断是否是好数,
//可以调用函数来判断,这个函数是我们自己编写,让输出这个好数的个数
//计算有多少个好数
int N;
std::cin>>N;
int count = 0;
for(int i = 1; i <= N; i++){
if(isGood(i)){
count++;
}
}
std::cout<<count;
return 0;
}
四、反思
标记数的奇偶代表位数的奇偶