蓝桥杯省赛真题C++B组-2024好数

发布于:2025-03-16 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、题目

问题描述
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。

给定一个正整数 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; 
} 

 

四、反思 

标记数的奇偶代表位数的奇偶