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

C语言如何实现对存储为字符串的正整数执行减1操作

C语言字符串正整数减1实现方案

实现逻辑

我们不需要把整个字符串转成整型再做运算(避免大数溢出问题),直接从字符串末尾的最低位开始逐位处理,支持任意长度的正整数字符串:

  1. 从字符串最后一位开始向前遍历
  2. 当前位数字如果大于'0',直接减1即可结束运算
  3. 当前位数字等于'0',将其设为'9',继续向前遍历处理借位
  4. 处理完全部位后如果存在前置0,删除多余的前置0(仅保留1位0的特殊场景,比如"1"减1得到"0")

完整代码实现

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

void str_decrement(char *nums) {
    int len = strlen(nums);
    int i = len - 1;
    int borrow = 1; // 初始需要减1,等价于借位标记为1

    // 从末尾开始处理借位
    while (i >= 0 && borrow) {
        int digit = nums[i] - '0';
        digit -= borrow;
        if (digit >= 0) {
            nums[i] = digit + '0';
            borrow = 0;
        } else {
            nums[i] = '9';
            borrow = 1;
        }
        i--;
    }

    // 处理前置0的情况
    int start = 0;
    // 只要第一位是0且长度大于1,就移除前置0
    while (nums[start] == '0' && start < len - 1) {
        start++;
    }
    if (start > 0) {
        // 将有效部分前移到数组开头,重叠区域用memmove更安全
        memmove(nums, nums + start, len - start + 1);
    }
}

int main() {
    // 测试用户示例
    char nums[] = "2462";
    str_decrement(nums);
    printf("%s\n", nums); // 输出 2461

    // 其他边界测试用例
    char test1[] = "1000";
    str_decrement(test1);
    printf("%s\n", test1); // 输出 999

    char test2[] = "1";
    str_decrement(test2);
    printf("%s\n", test2); // 输出 0

    char test3[] = "200";
    str_decrement(test3);
    printf("%s\n", test3); // 输出 199
    return 0;
}

注意事项

  • 入参必须是可修改的字符数组,不能传入字符串常量(比如char *str = "123"这种形式是只读的,写入会触发段错误)
  • 支持任意长度的正整数字符串,不会出现整型溢出问题
  • 处理结果直接写入原字符数组,无需额外申请堆内存

内容的提问来源于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.03 02:54:04