数位和
给定 n 个不超过 10^12 的正整数,求这 n 个正整数中数位和(即各数位数字相加的总和)的最大值。
题库1分钟阅读
小杨有 个正整数,小杨想知道这些正整数的数位和中最大值是多少。
“数位和”指的是一个数字中所有数位的和。例如:
对于数字 ,它的各个数位分别是 。将这些数位相加,得到
因此, 的数位和是 。
输入格式
第一行包含一个正整数 ,代表正整数个数。
之后 行,每行包含一个正整数。
输出格式
输出这些正整数的数位和的最大值。
样例
31681109对于全部数据,保证有 ,每个正整数不超过 。
数据规模达到 ,这意味着最多包含 10 万个数,编写程序时需要注意控制算法的时间复杂度。特别需要注意的是数值范围,单个数值最大可达 ,这已经超出了标准 32 位整型(C++ 中 int 的上限约为 )的表示范围。因此,在存储和处理数据时必须使用 64 位整型(如 C++ 中的 long long;而 Python 默认支持大整数,则无须进行特殊处理)。
利用模运算(取余 %)和整除(/)不断剥离最低位:
- 每次通过
x % 10拿到当前的个位数,累加到总和。 - 然后通过
x /= 10去掉个位数。 - 循环直到
x == 0。
示例:以
123为例
123 % 10 = 3,累加3,123 / 10 = 1212 % 10 = 2,累加2(此时和为 5),12 / 10 = 11 % 10 = 1,累加1(此时和为 6),1 / 10 = 0,结束。
维护一个全局变量 max_sum = 0:
- 每读入一个数,计算它的数位和。
- 如果计算出的数位和比
max_sum大,就更新max_sum。 - 处理完所有 个数后,输出
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;}