我怎样才能总结真正的大数字?

how can i sum realy big number?

所以你必须做:

11 = 1+1 = 2

3578=3+5+7+8=23=2+3=5

但问题是这个数字可能非常大(由10,000位数字组成)

但即使是最简单的入口也不起作用:

输入:11

输出:2798(它总是在变化,但仍然是一个 4 位数)

有人可以解释为什么会这样吗? 我如何总结一个非常大的数字的每个数字?

你得到这么大的数字是因为你的程序正在添加各种字符的 ASCII 值。

一些改进:

  • 不要使用"%s",使用"%<WIDTH>s",避免
  • 使用 size_t 遍历数组,而不是 unsigned long long int
  • 不要使用裸 return 0;,而是使用 return EXIT_SUCCESS;,它在头文件 stdlib.h.
  • 中定义
  • 总是检查scanf()输入是否成功
  • 不要检查 '\n',因为来自 scanf() 的字符串同时以 SPACES 和 NEWLINE 结尾。
  • 添加 +1 到 NULL 终止字符的数组大小
  • size_t
  • 使用 "%zu" 而不是 "%lld"

最终代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void) {
    char buffer[10001] = {0};

    if(scanf("%10000s", buffer) != 1)
    {
        perror("bad input");
        return EXIT_FAILURE;
    }

    size_t result = 0;
    for(size_t i = 0; buffer[i]; i++) {
        if(isdigit(buffer[i])){
            result += buffer[i] - '0';
        }
        else {
            perror("only digits are valid");
            return EXIT_FAILURE;
        }
    }

    printf("%zu\n", result);
    return EXIT_SUCCESS;
}

输出:

1112
5

TRY IT ONLINE

不占内存就可以了

#include <ctype.h>
#include <stdio.h>

int main(void) {
    int sum = 0;
    for (;;) {
        int ch = getchar();
        if (!isdigit((unsigned char)ch)) break; // leave loop with ENTER, EOF, 'a', ...
        sum += ch - '0';
    }
    printf("sum of digits is %d.\n", sum);
    return 0;
}

编辑:ideone

处的代码 运行

Wiki Digital Root 提供了获取最后一个数字的快捷方式。

  • 验证您的输入字符串是否只有数字
  • 求 ASCII 形式所有数字的总和
  • 利用同余公式得出结果。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX_NUM_LEN 10000

int digitRoot (int n) {
    if (0 == n) return 0;
    return (0 == (n % 9)) ? 9 : (n % 9);
}

int main () {
    char str_num [MAX_NUM_LEN];

    printf ("Finding Digital Root\nEnter a number : ");
    if (NULL == fgets (str_num, sizeof (str_num), stdin)) {
        perror ("Reading input string");
        return 2;
    }

    int slen = strlen (str_num);
    // remove new line if found
    if ('\n' == str_num[slen - 1]) str_num[--slen] = '[=10=]';
    // validate input
    int digitSum = 0;
    for (int ni = 0; ni < slen; ++ni) {
        if (!isdigit ((unsigned char) str_num[ni])) {
            printf ("\nERROR: Invalid digit [%c]\n", str_num[ni]);
            return 1;
        }
        digitSum += str_num[ni] - '0';
    }
    printf ("\nDigital Root is [%d]\n", digitRoot (digitSum));
    return 0;
}