You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言实现数字各位平方拼接功能时的0处理异常问题

C语言实现数字各位平方拼接功能时的0处理异常问题

嘿,我看了你的代码和问题描述,你遇到的核心问题是处理0的时候没有把0的平方值(也就是0)拼接到结果里,另外还有pow函数的精度坑,咱们一步步来拆解解决:

先说说你代码里的问题

  1. 0的处理逻辑遗漏关键步骤
    当digit是0时,你只做了k++,但完全没把0(也就是digit的平方)加到result里。比如原数中的0,平方后是0,这个0是需要拼到结果中的,但你的代码跳过了添加操作,自然就丢失了这个0,导致结果少了一位。

  2. pow函数的精度陷阱
    pow是浮点数运算函数,用来计算整数幂很容易出问题。比如pow(10,2)可能返回99.999999999而不是精确的100,当你用这个值去乘squared再转成整数时,就会得到错误的数值,这也会干扰最终结果的正确性。

  3. 边界情况未处理
    如果输入的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

火山引擎 最新活动