【发布时间】:2021-12-25 10:26:27
【问题描述】:
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int *arr=new int [n];
for(int k=0;n>k;k++)
{
cin>>*(arr+k);
}
long long sum1=0,sum2=0,sum3=0;
for(int k=0;n>k;k++)
{
sum1=sum1+*(arr+k);
if(*(arr+k)%2==0)
sum2++;
else
sum3++;
}
cout<<sum1<<" ";
cout<<sum3<<" ";
cout<<sum2;
return 0;
}
给你一个 N 个整数的序列,你的任务是分别打印它们的总和、奇数个数和偶数个数。
输入
输入的第一行包含一个整数 N (1≤N≤10⁵)。输入的第二行包含 N 个由单个空格分隔的整数 (1≤Ai≤10⁵)。
输出
分别打印它们的总和、奇数个数和偶数个数,用空格隔开。示例
输入
5
1 2 3 4 5
输出
15 3 2
这段代码有更好的算法吗?我需要它来减少执行时间。
我在哪里可以找到任何代码的更好算法?
【问题讨论】:
-
这段代码中不需要任何中间数组。对读取的每个数字保持运行记录,并为刚刚读取的值的奇数/偶数状态分别增加一对运行计数器。简而言之,第二个循环中的所有内容都可以在第一个循环中完成,并且可以完全丢弃数组本身。
-
golden_hacker,循环中不需要 3 个总和。在循环中增加 2 个和并计算循环后的第三个。
-
当 arr[k] 可读性更强时,为什么还要使用 *(arr+k)?
-
“n>k”同样奇怪。
-
你对性能有什么实际问题吗?