Online Compiler C

#include <stdio.h> // 这是一个用来计算单个数字数位之和的函数 int get_digit_sum(int num) { int sum = 0; while (num > 0) { sum += num % 10; // 剥下个位数累加 num /= 10; // 去掉个位数 } return sum; } int main() { int n; // 读入数字 n,别忘了取地址符 & if (scanf("%d", &n) != 1) { return 0; } // 用 long long 来存最终的总和,防止因数位加起来太大而溢出 long long total_sum = 0; // 从 1 循环到 n for (int i = 1; i <= n; i++) { total_sum += get_digit_sum(i); // 把每个数字的数位和累加进去 } // 打印 long long 类型变量,占位符要用 %lld printf("%lld\n", total_sum); return 0; }
这段代码的功能是:读入一个整数 n,然后计算从 1 到 n 所有整数的数位之和,并输出结果。例如输入 12,会计算 1+2+3+...+9+1+0+1+1+1+2 得到 51。

代码本身逻辑正确,但可能存在性能问题。当 n 很大时(比如 10^9),循环 n 次会非常慢。

- 你的代码对每个数字都单独计算数位和,时间复杂度是 O(n * log10(n))。对于大 n,可以考虑用数学规律来加速,比如按数位分组计算,而不是逐个数字累加。
- 注意 long long 的使用是正确的,但 total_sum 的最大值可能超过 long long 的范围吗?可以估算一下最坏情况下的总和大小,确认是否安全。