题目的主要信息:
- 输入一个正整数,求 之间偶数的和,并输出
方法一:累加
具体做法:
求 之间偶数的和意味着,求,一直加到或者为止,那我们可以从开始遍历,每次跨越两步使遍历的对象正好都是偶数,当遍历到大于就停止,这个过程累加即可。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0;
for(int i = 2; i <= n; i += 2) //从2开始,每两个元素遍历一次
sum += i; //累加
cout << sum << endl;
return 0;
}
复杂度分析:
- 时间复杂度:,一次遍历,循环次
- 空间复杂度:,无额外空间
方法二:数学规律
具体做法:
我们观察如下图
可以发现当为奇数时,答案为比其小的偶数的答案,而当为偶数等于它的一半乘上一半加1,对为偶数有公式:。
于是我们优先判断是否为奇数,如果是对其减1再按照公式计算,如果不是奇数,直接公式计算得到结果。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int sum = 0;
if(n % 2 == 1) //奇数等于比它小的那个偶数
n--;
sum = (n / 2) * (n / 2 + 1); //公式计算
cout << sum << endl;
return 0;
}
复杂度分析:
- 时间复杂度:,直接计算,常数时间
- 空间复杂度:,无额外空间