试题 C: 好数

试题 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;  
}

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值