C语言实现快乐数判断功能失败,测试用例7等场景返回结果异常
程序在输入为‘快乐数’时返回1,否则返回0。本题对快乐数的定义为:各位数字平方和构成的序列最终收敛到1的数;反之,序列收敛到0的数为非快乐数。
代码问题分析
你的代码存在4个核心问题,直接导致运行结果不符合预期:
- 逻辑理解错误,多余计算了单数字平方的各位平方和
快乐数的计算规则是对当前完整数字,计算所有位的平方和,再将这个和作为新数字重复计算,直到出现1或4,不需要对单个数字的平方再拆位计算平方和。
以输入7为例:
正确流程:7 → 7²=49 → 4²+9²=97 → 9²+7²=130 → 1²+3²+0²=10 → 1²+0²=1,最终返回1
你的代码流程:取出7 → 算7²=49 → 拆49计算4²+9²=97 → 直接结束,sum_2=97既不是1也不是4,结果错误 - 缺失迭代逻辑
你的代码只会对初始输入做一次处理,没有将计算得到的平方和作为新的输入重复计算,自然得不到最终收敛的1或4 - 函数存在未定义行为
当sum_2既不等于1也不等于4时,happy函数没有返回语句,C语言中这种情况会返回随机值,结果不可控 - 存在冗余变量
你定义的sum、i变量全程没有使用,属于无效代码
修正代码
如果你希望简化嵌套的迭代逻辑,只保留一层迭代循环,可以参考如下实现:
int happy(unsigned int num) { if (num == 0) { return 0; } unsigned int sum; // 外层只有一层迭代循环,直到结果收敛到1或4 while (num != 1 && num != 4) { sum = 0; // 内层仅做单轮平方和计算,不属于迭代逻辑嵌套 for (unsigned int tmp = num; tmp > 0; tmp /= 10) { unsigned int digit = tmp % 10; sum += digit * digit; } num = sum; } return num == 1 ? 1 : 0; }
主函数无需修改即可正常运行所有测试用例。
内容的提问来源于stack exchange,提问作者Gabriel Burzacchini
相关产品推荐
相关产品推荐

