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

C语言整数数字间插零函数实现问题求助

问题修复与代码优化

需求回顾

要实现一个insert_zeros函数,接收整数的地址,在数字的每两位之间插入零,直接修改原整数。示例如下:

insert_zeros(3) // 输出3
insert_zeros(39) // 输出309
insert_zeros(397) // 输出30907
insert_zeros(3976) // 输出3090706
insert_zeros(39765) // 输出309070605

你的代码里的两个核心问题

  • scanf参数错误:scanf("%d", num);这里必须传变量的地址&num,不然会触发内存访问错误,程序大概率崩溃。
  • 起始幂值计算逻辑错误:原代码里(count >= 3)? count += (count/2): count;的逻辑完全不符合你总结的规律,导致5位数处理时循环次数多了一次,末尾多出来一个零。

正确的规律推导

根据你给出的公式,其实可以总结出:

  • 对于n位数字,第1个数字的幂是2*(n-1),之后每个数字的幂依次减2,直到最后一个数字的幂为0。
    比如5位数:2*(5-1)=8,之后依次是6、4、2、0,正好对应你给出的3*10^8 +9*10^6 +7*10^4 +6*10^2 +5*10^0。

修正后的完整代码

#include <stdio.h>
#include <math.h>

void insert_zeros(int* num);

int main() {
    int num;

    printf("Enter a number:");
    scanf("%d", &num); // 修正:传入变量地址

    insert_zeros(&num);

    printf("Number after inserting zeros: %d\n", num);

    return 0;
}

void insert_zeros(int* num){
    int count = 0;
    int tmp = *num;

    // 统计数字的位数
    while(tmp != 0){
        tmp /= 10;
        count++;
    }

    // 特殊处理输入为0的情况
    if (count == 0) {
        *num = 0;
        return;
    }

    int divider = (int)pow(10, count-1);
    int current_power = 2 * (count - 1); // 正确的起始幂值
    tmp = *num;
    *num = 0;

    // 循环处理每一位数字,共count次
    for (int i = 0; i < count; i++) {
        int digit = tmp / divider; // 取出当前最高位数字
        *num += digit * (int)pow(10, current_power);
        tmp %= divider; // 移除已经处理的最高位
        divider /= 10;
        current_power -= 2; // 幂值每次减2
    }
}

关键修正点说明

  1. scanf参数修正:把num改成&num,确保scanf能正确写入输入值到变量中。
  2. 起始幂值计算:用2*(count-1)直接得到正确的起始幂,完全匹配你需要的公式。
  3. 循环逻辑调整:用for循环执行count次(等于数字的位数),确保每一位数字都被处理一次,彻底解决原代码中循环次数过多导致的末尾多零问题。
  4. 增加零值处理:如果输入是0,直接返回0,避免统计位数时count为0的异常情况。

内容的提问来源于stack exchange,提问作者Bohdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:20:59