{ }codelper
指针返回多个值P0073

用指针带回最小值、最大值与和

第一行给出 n,第二行给出 n 个整数。
在一行中输出它们的最小值、最大值与和,用一个空格分隔。
试着写一个函数 stats 来解:它接收数组、长度,以及调用方三个变量的地址,把最小值、最大值与和写进去(C 用指针 int *,C++ 也可以用引用 int&)。
main 调用这个函数一次,然后输出这三个变量。

输入
1 ≤ n ≤ 100,000,所有数都是 -1,000,000,000 到 1,000,000,000 之间的整数
输出
一行:最小值 最大值 和
样例 1 · stdin
4
3 8 1 6
stdout
1 8 18
样例 2 · stdin
3
-5 -2 -9
stdout
-9 -2 -16
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 2 种语言题解

这道题只接受 C 和 C++。
把调用方变量的地址传进去、让函数把结果写进去的指针只有这两种语言有,Python、JavaScript、TypeScript、Java 和 Craykon 都没有(C# 只能在 unsafe 里用)。
C 写成 void stats(const int *a, int n, int *mn, int *mx, long long *sum),用 & 传地址,如 stats(a, n, &mn, &mx, &sum),在函数里写 *mn = ...。
C++ 用引用 int& mn 更简单,调用时也不用 &。
其他语言返回多个值时用 Python return lo, hi, s、C# 元组或 out int mn,Java 则装进数组或对象。
三个陷阱:① 用 int mn 而不是 int *mn 接收,函数只写进副本,调用方变量保持初值,也不报错。
② 和最大可达 10亿 × 10万 = 10¹⁴,超出 int(约 21 亿),要用 long long 和 %lld。
③ 最小值、最大值从 0 开始,全是正数时最小值、全是负数时最大值会变成 0。
要从第一个元素 a[0] 开始。

C++main.cpp · 27 行
#include <iostream>#include <vector> // C++는 같은 일을 참조(&)로 한다. 포인터 int* 로 받아도 되지만 참조는 null이 될 수 없다void stats(const std::vector<int>& a, int& mn, int& mx, long long& sum) {    mn = mx = a[0];    sum = 0;    for (int v : a) {        if (v < mn) mn = v;        if (v > mx) mx = v;        sum += v;    }} int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(nullptr);    int n;    std::cin >> n;    std::vector<int> a(n);    for (int& v : a) std::cin >> v;     int mn, mx;    long long sum;    stats(a, mn, mx, sum);    std::cout << mn << " " << mx << " " << sum << "\n";}
Cmain.c · 28 行
#include <stdio.h>#include <stdlib.h> /* 결과 세 개를 부른 쪽 변수의 주소로 받아서, 그 자리에 써 넣는다 */void stats(const int *a, int n, int *mn, int *mx, long long *sum) {    *mn = *mx = a[0];  /* 첫 칸으로 시작해야 모두 양수·모두 음수일 때도 맞다 */    *sum = 0;    for (int i = 0; i < n; i++) {        if (a[i] < *mn) *mn = a[i];        if (a[i] > *mx) *mx = a[i];        *sum += a[i];  /* 합은 long long: 10억 × 10만은 int를 넘는다 */    }} int main(void) {    int n;    scanf("%d", &n);    int *a = malloc(n * sizeof *a);    for (int i = 0; i < n; i++) scanf("%d", &a[i]);     int mn, mx;    long long sum;    stats(a, n, &mn, &mx, &sum);  /* 주소를 넘긴다 */    printf("%d %d %lld\n", mn, mx, sum);     free(a);    return 0;}