跳过并跳转到主要内容
BigO

数位和

给定 n 个不超过 10^12 的正整数,求这 n 个正整数中数位和(即各数位数字相加的总和)的最大值。

题库1分钟阅读

小杨有 nn 个正整数,小杨想知道这些正整数的数位和中最大值是多少。

“数位和”指的是一个数字中所有数位的和。例如:

对于数字 1234512345,它的各个数位分别是 1,2,3,4,51,2,3,4,5。将这些数位相加,得到

1+2+3+4+5=151+2+3+4+5=15

因此,1234512345 的数位和是 1515

输入格式

第一行包含一个正整数 nn,代表正整数个数。

之后 nn 行,每行包含一个正整数。

输出格式

输出这些正整数的数位和的最大值。

样例

3
16
81
10
9

对于全部数据,保证有 1n1051\leq n\leq 10^5,每个正整数不超过 101210^{12}

数据规模达到 n105n \le 10^5,这意味着最多包含 10 万个数,编写程序时需要注意控制算法的时间复杂度。特别需要注意的是数值范围,单个数值最大可达 101210^{12},这已经超出了标准 32 位整型(C++ 中 int 的上限约为 2×1092 \times 10^9)的表示范围。因此,在存储和处理数据时必须使用 64 位整型(如 C++ 中的 long long;而 Python 默认支持大整数,则无须进行特殊处理)。

利用模运算(取余 %)和整除(/)不断剥离最低位:

  • 每次通过 x % 10 拿到当前的个位数,累加到总和。
  • 然后通过 x /= 10 去掉个位数。
  • 循环直到 x == 0

示例:以 123 为例

  • 123 % 10 = 3,累加 3123 / 10 = 12
  • 12 % 10 = 2,累加 2(此时和为 5),12 / 10 = 1
  • 1 % 10 = 1,累加 1(此时和为 6),1 / 10 = 0,结束。

维护一个全局变量 max_sum = 0

  • 每读入一个数,计算它的数位和。
  • 如果计算出的数位和比 max_sum 大,就更新 max_sum
  • 处理完所有 nn 个数后,输出 max_sum

注意 C++ 变量要用 long long 接收输入。

#include <iostream>
#include <algorithm>
using namespace std;
// 计算数位和函数
long long getDigitSum(long long x) {
long long sum = 0;
while (x > 0) {
sum += x % 10;
x /= 10;
}
return sum;
}
int main() {
// 优化 I/O 速度,防止 10^5 数据量超时
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long max_sum = 0;
for (int i = 0; i < n; ++i) {
long long num;
cin >> num;
max_sum = max(max_sum, getDigitSum(num));
}
cout << max_sum << "\n";
return 0;
}

© 2026 五五开 · 一方通行,只管向前。

旅途由 Astro 驱动 · 主题 Chirping Astro