题目
题意
输入\(n\)和\(m\)以及接下来的\(n\)个数,求出这\(n\)个数的平均值以及平均值\(\times m\)的结果
解题步骤
- 先读入\(n\)和\(m\):
cin >> n >> m;
- 由于题目中的输入数据的数量是不固定的(由\(n\)来决定),所以我们输入的时候需要使用到循环(循环\(n\)次进行输入)。我们可以用\(i\)作为循环变量,让\(i\)从\(1\)到\(n\)进行循环,每次循环的过程中读入一个数,最终就可以实现读入\(n\)个数的效果:
for (int i = 1;i <= n;i++){
cin >> a;
}
- 因为最终要求的是这\(n\)个数的平均数,所以我们在读入的时候定义一个新变量\(sum\),顺便计算这\(n\)个数的和,最后\(sum \div n\)即可:
for (int i = 1;i <= n;i++){
cin >> a;
sum = sum + a;
}
- 因为题目最下方的数据范围告诉我们最终平均数是一个整数,所以不需要使用\(double\)或者\(float\),要求平均数,直接输出\(sum \div n\):
cout << sum / n;
- 但是,题目中还让输出能航行的光年数,根据“题意”中的分析,应该再输出\(sum \div n \times m\):
cout << sum / n << " " << sum / n * m;
注意事项
- 根据题目数据范围,\(sum\)的最大值应该是\(1000 \times 10000000 = 10^{10} > 2^{31}-1\),也就是说,\(sum\)的最大值是比\(int\)数据类型能存储的最大值还要大的,因此,我们需要将\(sum\)变量定义为\(long long\)类型,否则就可能会出现数据溢出的情况:
long long sum;
- 输出的时候要严格按照输出样例来,不要忘了中间的空格
完整代码(std)
#define isdigit(x) ((x) >= 48 && (x) <= 57)
#include <bits/stdc++.h>
using namespace std;
int n,m,a;
long long sum;
int read(){
char c = getchar();
int res = 0;
while (!isdigit(c)) c = getchar();
while (isdigit(c)) res = (res << 1) + (res << 3) + c - 48,c = getchar();
return res;
}
int main(){
n = read(),m = read();
for (register int i = 1;i <= n;i++) a = read(),sum += a;
printf("%d %d",sum / n,sum / n * m);
return 0;
}
上面的代码运用了一些奇怪的技巧,下面是没有特殊技巧的代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,a;
long long sum;
int main(){
cin >> n >> m;
for (int i = 1;i <= n;i++){
cin >> a;
sum = sum + a;
}
cout << sum / n << " " << sum / n * m;
return 0;
}