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

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;
}
代码说明
  1. 输入处理部分自动过滤换行符等非数字字符,完全符合题目"每行输入一个数字、EOF结束"的输入规则
  2. 全程没有使用数组存储数字,仅用了5个int变量,内存占用不到30字节,不管输入的数字有多少位都不会触发MLE
  3. 奇偶位和累加时直接对11取模,变量永远不会超过10,完全不会出现数值溢出问题,支持任意长度的超大数字
  4. 所有统计逻辑都在单次遍历输入的过程中完成,时间复杂度为O(n),执行效率也最高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:51:02