You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求问:统计小于n且同时含7和9的数字的代码错误排查

问题分析与解决方法

嘿,我来帮你揪出代码里的问题!你的两段代码逻辑本质上是一样的,之所以用&&连接后结果始终为0,是因为你判断“数字包含7”和“数字包含9”的方式完全错误了。

你的判断逻辑错在哪?

你用i%10==7、i%100==7这类条件,其实是在判断:

  • i%10==7:数字的最后一位是7(这个是对的)
  • i%100==7:数字的最后两位是07(也就是i=7、107、207...这类数),而不是数字里包含7在十位上
  • 同理,i%1000==7是判断最后三位是007,以此类推

举个例子,拿你说的79来看:

  • 检查是否包含7时,79%10=9≠7,79%100=79≠7,后面的取模结果也都不等于7,所以第一个条件直接不成立
  • 再看97:第一个条件里97%10=7是成立的,但第二个条件里,97%10=7≠9,97%100=97≠9,所有取模条件都不满足,所以&&的结果是false

这样一来,符合要求的数根本不会被统计到,结果自然是0。

正确的实现方式

我们需要写一个辅助函数,专门用来检查一个数字里是否包含某个指定的数字,然后在主函数里判断每个数是否同时包含7和9。

完整代码示例:

#include <iostream>

// 检查num中是否包含digit这个数字
bool containsDigit(int num, int digit) {
    // 特殊处理num=0的情况,如果你的需求里0不需要统计,可以去掉这个判断
    if (num == 0 && digit == 0) {
        return true;
    }
    // 逐位检查数字
    while (num > 0) {
        if (num % 10 == digit) {
            return true;
        }
        num /= 10; // 去掉最后一位
    }
    return false;
}

int allWith7And9(int n) {
    int count = 0;
    for (int i = 0; i < n; ++i) {
        // 同时包含7和9才计数
        if (containsDigit(i, 7) && containsDigit(i, 9)) {
            ++count;
        }
    }
    return count;
}

// 测试用例
int main() {
    std::cout << "n=10时结果:" << allWith7And9(10) << std::endl; // 输出0
    std::cout << "n=100时结果:" << allWith7And9(100) << std::endl; // 输出2
    return 0;
}

额外说明

因为n最大是1000000,循环100万次在C++里完全没问题,运行速度很快。如果以后n更大(比如1e9),可以考虑用数位DP来优化,但目前这个场景不需要。

内容的提问来源于stack exchange,提问作者Just A Mathematician

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:08:49