好数
题目描述
【问题描述】
一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称之为“好数”。
给定一个正整数 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。
暴力方法一
从题目中可以得出结论:奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数
那么就可以定义一个k代表数字n的当前位数,从1开始计数,即个位是1,十位是2,百位是3……
然后就可以从个位开始取数,判断该数是否为好数,每取走一位,k加上1,进入下一位
// 包含C++程序中常用的库,是C++标准库的一个集合,包括了I/O、字符串和容器等
#include<bits/stdc++.h>
// 使用std命名空间中的名字,避免每次调用标准库中的东西都要加上std::前缀
using namespace std;
// 定义一个函数check,用于检查某个整数n是否是“好数”
bool check(int n)
{
int k=1; // 代表数字n的当前位数,从1开始计数,即个位是1,十位是2,百位是3,以此类推
// 循环检查整数n的每一位
while(n)
{
int t=n%10; // t为n的当前最低位的数字,%运算符取余数
// 检查当前位数k是否与对应的数字t符合好数的定义
if(k%2==1 && t%2==0) // 如果位数k是奇数但数字t是偶数,则不满足好数的定义
return false; // 返回false,表示n不是好数
if(k