You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现数字逐位平方拼接功能在大数测试用例报错排查

错误原因分析
  • 核心问题是你使用了<math.h>头文件中的浮点函数pow进行整数运算,浮点数的精度截断误差直接导致了大数字场景下的结果错误,和你之前排查的溢出问题无关。
    双精度浮点数(double)的有效精度只有约15~17位十进制数,当你计算pow(10, 大指数)时,返回的结果并非精确整数,比如pow(10, 18)实际可能返回999999999999999936这类近似值,转成整数后参与运算自然会得到错误结果,你遇到的3999999999测试用例输出偏差就是这个原因导致的。
  • 次要问题:用浮点运算计算数字位数、单个数字平方属于完全没必要的冗余实现,既降低效率又引入精度风险:
    1. 单个数字的平方直接用(n % 10) * (n % 10)计算即可,完全不需要调用pow
    2. 单个数字的平方结果最多是两位(9²=81),拼接时直接判断平方值是否大于等于10,就能确定要给结果左移1位还是2位,根本不需要调用log10计算位数
    3. 初始计算输入数字的位数也可以用循环除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:54:03