描述
题目描述
首先给我们一个数字,代表我们接下来有个整数,然后我们对这个整数进行统记,正数求和最后求取平均值,负数计算个数最后输出
样例描述
首先给定样例输入
5
1 2 3 4 5
10
1 2 3 4 5 6 7 8 9 0
第一组数据我们有个数字,然后我们统计,没有负数,然后平均值是保留了一位小数
第二组数据我们有个数字,然后我们统计,没有复数,然后平均值是保留了一位小数
所以我们的样例输出是
0 3.0
0 5.0
图解代码
题解
解法一:C++
解题思路:
首先我们多组输入,然后我们在输入的过程中进行统计出正数的和和个数,负数的个数
代码实现
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
while (cin >> n) {
int cnt = 0, sum = 0, num = 0;
// cnt 为负数个数,sum为正数的和,num为正数的个数
vector<int> a(n);
// 开辟大小为 n 的数组
for (auto &it : a) {
// 边输入边统计
cin >> it;
if (it < 0) ++ cnt;
else if (it > 0) sum += it, ++ num;
}
cout << cnt << " " << fixed << setprecision(1) << sum * 1.0 / num << endl;
// 保留一位小数
}
}
signed main() {
solve();
return 0;
}
时空复杂度分析
时间复杂度:
理由如下:我们只进行了一个输入的输入,数组的长度为
空间复杂度:
理由如下:我们开辟了一个长度为的数组
解法二:基于解法一的优化
实现思路:
其实我们发现我们可以不需要开辟一个数组,我们可以每次都是只是输入一个值,然后统计即可,我们可以把时间优化下来
代码实现:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, tmp, cnt, sum, num;
// n代表n个数字,tmp为每次输入的数字,cnt代表我们负数的个数,sum代表正数的和,num代表正数的个数
while (cin >> n) {
cnt = sum = num = 0;
// 每次清零
for (int i = 1; i <= n; i++) {
cin >> tmp;
if (tmp < 0) ++ cnt;
else if (tmp > 0) sum += tmp, ++ num;
}
cout << cnt << " " << fixed << setprecision(1) << sum * 1.0 / num << "\n";
}
}
signed main() {
solve();
return 0;
}
时空复杂度分析
时间复杂度:
理由如下:我们只进行了一个输入的输入,数组的长度为
空间复杂度:
理由如下:我们只使用了常数的变量空间