C语言实现数字各位平方拼接功能时的0处理异常问题
C语言实现数字各位平方拼接功能时的0处理异常问题
嘿,我看了你的代码和问题描述,你遇到的核心问题是处理0的时候没有把0的平方值(也就是0)拼接到结果里,另外还有pow函数的精度坑,咱们一步步来拆解解决:
先说说你代码里的问题
0的处理逻辑遗漏关键步骤
当digit是0时,你只做了k++,但完全没把0(也就是digit的平方)加到result里。比如原数中的0,平方后是0,这个0是需要拼到结果中的,但你的代码跳过了添加操作,自然就丢失了这个0,导致结果少了一位。pow函数的精度陷阱pow是浮点数运算函数,用来计算整数幂很容易出问题。比如pow(10,2)可能返回99.999999999而不是精确的100,当你用这个值去乘squared再转成整数时,就会得到错误的数值,这也会干扰最终结果的正确性。边界情况未处理
如果输入的n是0,log10(0)是未定义的,会直接导致程序崩溃,你的代码没有处理这种极端情况。
给你一个修正后的实现思路
我建议换一种更直观的方式:从数字的高位到低位依次处理每一位,这样不用维护复杂的k变量,也避免了反转结果的麻烦,同时用整数计算幂次,避开pow的坑。
修正后的代码如下:
unsigned long long square_digits(unsigned n) { // 处理输入为0的边界情况 if (n == 0) return 0; unsigned long long result = 0; unsigned temp = n; int digits = 0; // 先计算输入数字的总位数 while (temp != 0) { digits++; temp /= 10; } // 计算最高位的除数(比如3210的最高位除数是1000) unsigned power = 1; for (int i = 1; i < digits; i++) { power *= 10; } // 从高位到低位遍历每一位数字 while (power > 0) { // 取出当前位的数字 int digit = n / power; // 计算平方值 int squared = digit * digit; // 根据平方值的位数,扩展结果并添加平方值 if (squared < 10) { // 平方是一位数,结果先乘10再加平方值 result = result * 10 + squared; } else { // 平方是两位数,结果先乘100再加平方值 result = result * 100 + squared; } // 去掉当前处理的高位,继续处理剩下的数字 n %= power; power /= 10; } return result; }
代码逻辑说明
- 先处理n=0的特殊情况,避免后续计算出错。
- 通过循环计算输入数字的总位数,然后得到最高位的除数(比如数字3210的除数是1000)。
- 从高位到低位依次取出每一位数字,计算平方后,根据平方值的位数(1位或2位),将当前结果乘以10或100,再加上平方值,这样就完成了拼接操作。
- 全程用整数运算,完全避开了浮点数精度问题。
测试一下输入3210987654,这个代码会正确输出9410816449362516,和你预期的结果一致。
备注:内容来源于stack exchange,提问作者Pantha Protick




