C语言超大十进制数处理题能否使用数组及实现思路咨询
实现思路
这道题的核心难点是超大数字无法用普通整型存储,同时全量存储数字会触发内存超限,实际上四个统计需求完全不需要存储完整数字,只需要逐字符读取输入、边读边统计即可,全程仅需要几个变量,内存占用固定为常数级,不会触发MLE,也不会有溢出问题:
- 统计位数:每读取一个有效数字,位数计数器加1即可
- 判断是否为偶数:偶数仅和最后一位数字有关,每次读取数字时更新保存最后一位的变量,最终判断最后一位是否能被2整除即可
- 统计0的个数:每读取到数字0,对应计数器加1即可
- 判断是否为11的倍数:根据题目给出的规则,只需要分别累计奇数位和、偶数位和,最终计算两者差值是否为11的倍数即可,甚至可以每次累加后直接对11取模,完全避免数值溢出
完整实现代码
#include <stdio.h> int main() { int digit_cnt = 0; // 统计总位数 int last_digit = 0; // 存储最后一位数字,用来判断偶数 int zero_cnt = 0; // 统计0的个数 int odd_sum_mod = 0; // 奇数位数字和模11的结果 int even_sum_mod = 0; // 偶数位数字和模11的结果 char c; // 逐字符读取输入直到EOF while ((c = getchar()) != EOF) { // 跳过换行、空格等非数字字符,适配每行输入一个数字的规则 if (c < '0' || c > '9') { continue; } int num = c - '0'; // 将字符转为对应数值 digit_cnt++; last_digit = num; // 统计0的个数 if (num == 0) { zero_cnt++; } // 累计奇偶位的和,直接模11避免溢出 if (digit_cnt % 2 == 1) { odd_sum_mod = (odd_sum_mod + num) % 11; } else { even_sum_mod = (even_sum_mod + num) % 11; } } // 按要求输出四个结果 printf("%d\n", digit_cnt); // 输出是否为偶数 printf("%d\n", last_digit % 2 == 0 ? 1 : 0); // 输出0的个数 printf("%d\n", zero_cnt); // 输出是否为11的倍数:差值模11为0则符合要求 int diff_mod = (odd_sum_mod - even_sum_mod) % 11; printf("%d\n", diff_mod == 0 ? 1 : 0); return 0; }
代码说明
- 输入处理部分自动过滤换行符等非数字字符,完全符合题目"每行输入一个数字、EOF结束"的输入规则
- 全程没有使用数组存储数字,仅用了5个int变量,内存占用不到30字节,不管输入的数字有多少位都不会触发MLE
- 奇偶位和累加时直接对11取模,变量永远不会超过10,完全不会出现数值溢出问题,支持任意长度的超大数字
- 所有统计逻辑都在单次遍历输入的过程中完成,时间复杂度为O(n),执行效率也最高
内容的提问来源于stack exchange,提问作者user14393399
相关产品推荐
相关产品推荐

