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,提问作者안진호
相关产品推荐
相关产品推荐

