文章

【GESP】C++二级真题 luogu-B4065 [GESP202412 二级] 数位和

GESP二级真题,多层循环和分支练习,难度★✮☆☆☆。

luogu-B4065 [GESP202412 二级] 数位和

题目要求

题目描述

小杨有 $n$ 个正整数,小杨想知道这些正整数的数位和中最大值是多少。“数位和”指的是一个数字中所有数位的和。例如:对于数字 $12345$,它的各个数位分别是 $1,2,3,4,5$。将这些数位相加,得到

\[1+2+3+4+5=15\]

因此,$12345$ 的数位和是 $15$。

输入格式

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

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

输出格式

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

输入 #1

1
2
3
4
3
16
81
10

输出 #1

1
9

说明/提示

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


题目分析

解题思路

  1. 首先,读取测试数据的数量 $n$,以了解需要处理的正整数数量。
  2. 接着,对于每个正整数,通过循环取出其每一位数(从个位到最高位),并将这些位数相加,计算出该数的数位和。
  3. 在计算每个数的数位和时,需要与当前的最大数位和进行比较。如果当前数的数位和大于最大数位和,则更新最大数位和,确保最大数位和始终保持着最大的数位和。
  4. 最后,输出最大数位和,即所有正整数中数位和最大的那个数的数位和。

—·

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main() {
    int n; // 读取测试数据的数量
    cin >> n;
    long long a; // 读取正整数 a
    long long max = 0; // 初始化最大数位和为0
    for (int i = 1; i <= n; i++) {
        cin >> a; // 读取每个正整数
        int ans = 0; // 初始化当前数的数位和为0
        while (a != 0) {
            int j = a % 10; // 取出当前数的最后一位
            ans += j; // 将最后一位加到数位和中
            a /= 10; // 移除当前数的最后一位
        }
        if (ans > max) {
            max = ans; // 如果当前数的数位和大于最大数位和,则更新最大数位和
        }
    }
    cout << max; // 输出最大数位和
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权