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

C语言程序求助:统计指定区间内包含特定数字模式的整数数量

我来帮你梳理代码里的问题,一步步解决这个统计数字模式的需求~

你的代码核心问题分析

首先,最致命的错误是C语言不支持链式比较表达式,比如你写的1<=nump<10,在C里会被拆解成(1<=nump) <10——先判断1<=nump得到0或1,再拿这个结果和10比较,永远为真。这会导致你的分支逻辑完全混乱,比如模式是11时,会错误进入1位模式的分支,而不是2位模式的分支。所有区间判断都要改成nump >=1 && nump <10这种逻辑与的形式。

其次,部分变量命名不够清晰(比如a、b、c、d),虽然不影响功能,但会增加维护难度,建议改成有意义的名字,比如first_two、last_two。

修正后的代码(保留你的原始思路)

我把所有错误的条件判断修正了,同时优化了变量命名,让逻辑更清晰:

#include <stdio.h>

int main() {
    int start, end, pattern;
    int i;
    int count = 0;

    printf("Start: ");
    scanf("%d", &start);
    printf("End: ");
    scanf("%d", &end);
    printf("Pattern: ");
    scanf("%d", &pattern);

    // 处理1位模式(1-9)
    if (pattern >= 1 && pattern < 10) {
        for (i = start; i <= end; i++) {
            int digit1 = i / 1000;
            int digit2 = i / 100 % 10;
            int digit3 = i / 10 % 10;
            int digit4 = i % 10;
            if (pattern == digit1 || pattern == digit2 || pattern == digit3 || pattern == digit4) {
                count++;
            }
        }
    }
    // 处理2位模式(10-99)
    else if (pattern >= 10 && pattern < 100) {
        for (i = start; i <= end; i++) {
            if (i < 10) {
                continue; // 位数不足2位,跳过
            } else if (i < 100) {
                if (i == pattern) {
                    count++;
                }
            } else if (i < 1000) {
                int first_two = i / 10;    // 百位+十位
                int last_two = i % 100;    // 十位+个位
                if (first_two == pattern || last_two == pattern) {
                    count++;
                }
            } else { // 四位数
                int first_two = i / 100;   // 千位+百位
                int mid_two = i / 10 % 100;// 百位+十位
                int last_two = i % 100;    // 十位+个位
                if (first_two == pattern || mid_two == pattern || last_two == pattern) {
                    count++;
                }
            }
        }
    }
    // 处理3位模式(100-999)
    else if (pattern >= 100 && pattern < 1000) {
        for (i = start; i <= end; i++) {
            if (i < 100) {
                continue; // 位数不足3位,跳过
            } else if (i < 1000) {
                if (i == pattern) {
                    count++;
                }
            } else { // 四位数
                int first_three = i / 10;  // 千位+百位+十位
                int last_three = i % 1000; // 百位+十位+个位
                if (first_three == pattern || last_three == pattern) {
                    count++;
                }
            }
        }
    }
    // 处理4位模式(1000-9999)
    else if (pattern >= 1000 && pattern <= 9999) {
        for (i = start; i <= end; i++) {
            if (i == pattern) {
                count++;
            }
        }
    }

    printf("Result: %d\n", count);
    return 0;
}

更简洁的通用方案(避免按位数分支)

你的原始思路是按模式位数分类,虽然可行,但代码冗余。我们可以写一个辅助函数,统一判断任意数字是否包含指定模式,这样不管模式是几位,逻辑都一样:

#include <stdio.h>

// 辅助函数:判断num是否包含pattern这个数字模式
int hasPattern(int num, int pattern) {
    // 先计算模式的位数和对应的除数(比如pattern=11,除数是100,用来提取连续2位)
    int patternLen = 0;
    int tempPattern = pattern;
    int divisor = 1;
    while (tempPattern > 0) {
        patternLen++;
        divisor *= 10;
        tempPattern /= 10;
    }
    divisor /= 10; 

    // 遍历num的所有连续patternLen位片段
    int tempNum = num;
    while (tempNum >= pattern) {
        int currentSeg = tempNum % divisor;
        if (currentSeg == pattern) {
            return 1; // 找到匹配,返回真
        }
        tempNum /= 10; // 右移一位,检查下一个片段
    }
    // 特殊情况:num和pattern位数相同,直接比较
    return num == pattern ? 1 : 0;
}

int main() {
    int start, end, pattern;
    int count = 0;

    printf("Start: ");
    scanf("%d", &start);
    printf("End: ");
    scanf("%d", &end);
    printf("Pattern: ");
    scanf("%d", &pattern);

    for (int i = start; i <= end; i++) {
        if (hasPattern(i, pattern)) {
            count++;
        }
    }

    printf("Result: %d\n", count);
    return 0;
}

这个方案的优势是不用针对不同位数的模式写重复代码,逻辑更清晰,也更容易扩展(比如如果以后支持更长的模式,只需要修改辅助函数的逻辑即可)。

测试验证

比如输入Start:10, End:300, Pattern:11,修正后的代码会正确统计出12个符合条件的数字:11、110-119(10个)、211。

内容的提问来源于stack exchange,提问作者안진호

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:42:33