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

C语言实现字符串存储大整数减1,不转整型如何实现?

实现方案

核心逻辑是直接对字符串逐位模拟手工减法的借位操作,完全不需要转整数,支持任意长度的正整数字符串:

  • 从字符串的最后一位开始向前遍历
  • 若当前位为'0',说明需要向高位借位,直接将当前位置为'9',继续向前遍历
  • 遇到第一个非'0'的字符时,将该字符的数值减1后写回,终止遍历
  • 最后处理前导零:如果减完后字符串第一位是'0'且字符串长度大于1,则将整个字符串向前移动一位,去掉前导零;如果输入是"1",减1后保留单个"0"即可

实现代码

#include <stdio.h>
#include <string.h>

void str_subtract_one(char* num) {
    int len = strlen(num);
    int i = len - 1;

    // 从末尾开始处理借位
    while (i >= 0 && num[i] == '0') {
        num[i] = '9';
        i--;
    }

    // 此时i指向第一个非0位,减1即可
    num[i] -= 1;

    // 处理前导零的情况,比如输入"1000"减1后第一位是'0',需要前移
    if (num[0] == '0' && len > 1) {
        // 把从第1位开始的所有字符往前挪一位
        for (i = 0; i < len - 1; i++) {
            num[i] = num[i + 1];
        }
        num[len - 1] = '\0';
    }
}

int main()  {
    // 测试用例1:超过long long范围的超长数字
    char nums1[] = "2462343434344545898798798798798";
    str_subtract_one(nums1);
    printf("测试用例1结果:%s\n", nums1);

    // 测试用例2:末尾带多个0
    char nums2[] = "1000";
    str_subtract_one(nums2);
    printf("测试用例2结果:%s\n", nums2);

    // 测试用例3:单数字1
    char nums3[] = "1";
    str_subtract_one(nums3);
    printf("测试用例3结果:%s\n", nums3);

    // 测试用例4:普通短数字
    char nums4[] = "2323";
    str_subtract_one(nums4);
    printf("测试用例4结果:%s\n", nums4);

    return 0;
}

输出结果

测试用例1结果:2462343434344545898798798798797
测试用例2结果:999
测试用例3结果:0
测试用例4结果:2322

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:57:02