第一行给出 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
错误列表00F8 ↓ · ⇧F8 ↑
输入(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;}