C语言实现数字逐位平方拼接功能在大数测试用例报错排查
错误原因分析
- 核心问题是你使用了
<math.h>头文件中的浮点函数pow进行整数运算,浮点数的精度截断误差直接导致了大数字场景下的结果错误,和你之前排查的溢出问题无关。
双精度浮点数(double)的有效精度只有约15~17位十进制数,当你计算pow(10, 大指数)时,返回的结果并非精确整数,比如pow(10, 18)实际可能返回999999999999999936这类近似值,转成整数后参与运算自然会得到错误结果,你遇到的3999999999测试用例输出偏差就是这个原因导致的。 - 次要问题:用浮点运算计算数字位数、单个数字平方属于完全没必要的冗余实现,既降低效率又引入精度风险:
- 单个数字的平方直接用
(n % 10) * (n % 10)计算即可,完全不需要调用pow - 单个数字的平方结果最多是两位(9²=81),拼接时直接判断平方值是否大于等于10,就能确定要给结果左移1位还是2位,根本不需要调用
log10计算位数 - 初始计算输入数字的位数也可以用循环除10计数的方式实现,完全规避浮点误差
- 单个数字的平方直接用
修正示例代码
unsigned long long square_digits (unsigned n) { if (n == 0) return 0; unsigned long long result = 0; // 用临时数组存储每一位的平方结果,顺序和原数字位数顺序一致 int sq_arr[20] = {0}; int idx = 0; while (n > 0) { int d = n % 10; sq_arr[idx++] = d * d; n /= 10; } // 倒序拼接平方结果 for (int i = idx - 1; i >= 0; i--) { if (sq_arr[i] >= 10) { result = result * 100 + sq_arr[i]; } else { result = result * 10 + sq_arr[i]; } } return result; }
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

