题目描述
有一个函数f(n)=(−1)n∗n,其奇数项为负数,偶数项为正数,任给一个左端点和右端点,要求出该区间中各项的和(包括左右端点)
题解在代码中
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 容易看出,该数列中的 奇数项 一定是 负数 ,偶数项 一定是 正数。
// 而 左端点l 与 右端点r 之间每相邻两个数之和一定为 +1 或 -1
// 我们以 左端点l 为标记,假如 l % 2 == 0 即 l为偶数,假设l=4,它后面为-5,6,相邻两数之和为 +1,将l和r中间有几个 1 加上即可 (r - l) / 2;
// l 和 r 中间可能只有奇数个数,即当(r - l) % 2 == 1 的时候,那么此时还多出一个r,因为l是偶数,那么r一定是奇数,此时减去r即可
// 当左端点l 为 奇数 时,恰恰相反。
// 切记要先将左端点存入答案,当左端点为奇数时答案res减去l,为偶数时则加上它。
int main()
{
int n; //n 为 询问次数
cin >> n;
while(n --){//循环 n 次,每次循环表示询问一次
int l,r; // l 为左端点, r 为右端点
int res = 0;//设置一个答案为 0
cin >> l >> r;
if(l % 2 == 0) { //当 左端点 是 偶数 的情况
res += (r + l) / 2; // res += l; res += (r - l) / 2; 合并
if((r - l) % 2 == 1) res -= r; // 如果 r - l 不能被 2 整除, 那么 r 一定是奇数, 减去即可
}
else { //当 左端点 是 奇数 的情况
res -= (r + l) / 2; //res -= l; res -= (r - l) / 2; 合并
if((r - l) % 2 == 1) res += r; //如果r - l不能被 2 整除, 那么r一定是偶数,加上即可
}
cout << res << endl;
}
return 0;
}