题目的主要信息:

  • 输入一个正整数nn,求 1n1 - n 之间偶数的和,并输出

方法一:累加

具体做法:

1n1 - n 之间偶数的和意味着,求2+4+6+8+...2+4+6+8+...,一直加到nn或者n1n-1为止,那我们可以从22开始遍历,每次跨越两步使遍历的对象正好都是偶数,当遍历到大于nn就停止,这个过程累加即可。

#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;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),一次遍历,循环n/2n/2
  • 空间复杂度:O(1)O(1),无额外空间

方法二:数学规律

具体做法:

我们观察如下图:alt

可以发现当nn为奇数时,答案为比其小的偶数的答案,而当nn为偶数等于它的一半乘上一半加1,对nn为偶数有公式:(n/2)(n/2+1)(n/2)*(n/2+1)

于是我们优先判断nn是否为奇数,如果是对其减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;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),直接计算,常数时间
  • 空间复杂度:O(1)O(1),无额外空间