C语言实现数字各位求和与数位匹配函数的代码错误排查
需求说明
实现一个以int func(int num1, int num2)为开头的函数,实现过程不允许使用数组,功能如下:
- 接收两个整型参数
num1、num2,返回整型结果 - 第一步计算
num2的各位数字之和 - 第二步判断该和值是否作为连续数字片段存在于
num1的数位序列中,存在返回1,不存在返回0 - 匹配示例:
num1 = 51749,num2 = 566时,num2各位和为5+6+6=17,num1数位序列中存在连续片段17,符合匹配条件,返回1
原代码问题排查
你写的代码存在以下几个核心问题,导致运行不符合预期:
- 核心逻辑偏离需求:第一个循环错误计算了
num1的所有数位之和,需求不需要计算num1的数位总和,而是需要提取num1不同位置的连续数位片段,和num2的数位和做比对 - 运算符使用错误:条件判断里写的
sum =! num2是非法逻辑,=!是赋值+逻辑非操作,不是不等判断运算符!=;且执行到该判断时num2已经被前一个循环除到0,判断完全没有意义 - 函数缺失返回值:
func声明为返回int类型,但整个函数内没有return语句,main函数无法拿到正确的判断结果 - 存在无效冗余代码:
while (ad < 10)的循环和功能实现完全无关,属于无效逻辑 - 输出逻辑冲突:func内部直接打印提示文本,和main函数里的Yes/No打印逻辑冲突,会导致输出内容混乱;且main中连续两次调用func,属于无意义的性能损耗
修正后可运行代码
#include <stdio.h> #include <stdlib.h> int func(int num1, int num2) { // 处理负数,数位计算取绝对值 num1 = abs(num1); num2 = abs(num2); int sum2 = 0; int digit; // 计算num2的各位数字之和 while (num2 > 0) { digit = num2 % 10; sum2 += digit; num2 /= 10; } // 特殊处理sum为0的场景(即num2输入为0) if (sum2 == 0) { while (num1 > 0) { if (num1 % 10 == 0) return 1; num1 /= 10; } return 0; } // 计算sum2的位数,生成对应取模基数 int temp = sum2; int div = 1; while (temp > 0) { div *= 10; temp /= 10; } // 逐段提取num1的连续数位做匹配,全程不使用数组 while (num1 >= sum2) { int segment = num1 % div; if (segment == sum2) { return 1; } num1 /= 10; } // 遍历完无匹配返回0 return 0; } int main() { int a, b; printf("Type the first number "); scanf("%d", &a); printf("Type the second number "); scanf("%d", &b); int res = func(a, b); printf(res == 1 ? "Yes" : "No"); return 0; }
实现逻辑说明
- 数位和计算:通过逐次模10取末尾数字累加,再除10移除末尾数字的方式,计算得到num2的数位和
- 匹配基数生成:根据sum2的位数生成10的n次幂作为取模值,比如sum2是两位数就生成100,模100就能得到数字末尾连续两位的数值
- 连续片段匹配:每次取num1末尾和sum2相同长度的连续片段做相等判断,匹配到直接返回1;未匹配则将num1除10右移一位,继续取下一段做判断,直到num1长度小于sum2长度时停止,返回0
- 全程未使用数组,完全符合题目要求
内容的提问来源于stack exchange,提问作者Lala
相关产品推荐
相关产品推荐

