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
相关产品推荐
相关产品推荐

