计算数字位降序整数和的C程序异常问题排查
问题分析与修复
你的代码存在多个关键错误,导致输出不符合预期,以下是问题拆解和修复方案:
核心错误点
- sum初始化位置错误:你在每次输入整数后都执行
sum = 0,这会清空之前累加的结果,最终要么只保留最后一个符合条件的数,要么直接输出0。正确做法是把sum的初始化移到外层循环之前。 - temp未赋值:内层循环直接使用
temp,但没有将当前输入的n赋值给它,属于未定义行为。需要在每次处理新输入的n时,先执行temp = n;。 - 降序判断逻辑错误:当前代码只要发现某一对相邻位是降序,就立刻将当前数加入sum,还会重复累加(比如4321有3对相邻位,会被加3次)。正确逻辑是:检查整个数的所有相邻位是否都满足降序,只有全部符合才将该数计入总和。
- 计数变量c更新错误:当前代码每发现一对降序位就给c加1,导致c的数值远大于实际符合条件的数的个数,应该在确认整个数符合降序后,再将c加1。
修复后的代码
#include <stdio.h> int main() { int n, last, secondlast, sum = 0, c = 0; int temp; while (scanf("%d", &n) == 1) { int is_descending = 1; // 标记当前数是否为降序 temp = n; // 仅处理位数大于1的数,单个数字默认是降序 while (temp / 10 > 0) { last = temp % 10; secondlast = (temp / 10) % 10; if (secondlast <= last) { // 只要有一对不符合降序,立刻终止检查 is_descending = 0; break; } temp = temp / 10; } if (is_descending) { sum += n; c++; } } if (c == 0) { printf("There are no numbers that meet the requirements\n"); } else { printf("%d\n", sum); } return 0; }
测试验证
输入4321、75、56、4,79时:
- 4321:所有相邻位(4>3,3>2,2>1)均为降序,计入总和
- 75:7>5,符合条件,计入总和
- 56:5<6,不符合,跳过
- 4,79:遇到非整数,停止输入
最终总和为4321+75=4396,与预期结果一致。
内容的提问来源于stack exchange,提问作者shadoW
相关产品推荐
相关产品推荐

