C语言如何实现对存储为字符串的正整数执行减1操作
C语言字符串正整数减1实现方案
实现逻辑
我们不需要把整个字符串转成整型再做运算(避免大数溢出问题),直接从字符串末尾的最低位开始逐位处理,支持任意长度的正整数字符串:
- 从字符串最后一位开始向前遍历
- 当前位数字如果大于
'0',直接减1即可结束运算 - 当前位数字等于
'0',将其设为'9',继续向前遍历处理借位 - 处理完全部位后如果存在前置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
相关产品推荐
相关产品推荐

