1 条题解
-
0
区间整数求和 - 解题思路
这段代码计算给定区间[n, m]内所有整数的和,并处理各种可能的正负区间情况。
算法核心思路
-
输入处理:
- 读取测试用例数量tc
- 对于每个测试用例,读取区间端点n和m
-
分情况计算:
- 情况1:n和m都为正数
- 使用等差数列求和公式:和 = (首项+末项)×项数/2
- 计算项数 = m - n + 1
- 情况2:n和m都为负数
- 先取绝对值转换为正数区间
- 使用同样公式计算后再取负值
- 情况3:区间跨越0点
- 根据n和m的绝对值大小关系分别处理
- 计算正数部分和负数部分后合并结果
- 情况1:n和m都为正数
-
结果输出:
- 按照指定格式输出每个测试用例的结果
- 包含场景编号和求和结果
关键特点
- 高效计算:利用等差数列公式直接求和,避免循环累加
- 全面处理:覆盖所有可能的正负区间组合情况
- 数学优化:通过绝对值转换简化计算过程
- 格式规范:输出符合题目要求的格式
#include <iostream> #include <cstdio> #include <cmath> using namespace std; int main() { int tc, c = 0; long long sum, tmp1, tmp2, n , m; cin >> tc; while (tc--){ c++; cin >> n >> m; if (n > 0 && m > 0){ tmp1 = (n+m); tmp2 = (m-n+1); sum = tmp1 * tmp2 / 2; } else if (n < 0 && m < 0){ n = abs(double(n)); m = abs(double(m)); tmp1 = (n+m); tmp2 = (n-m+1); sum = tmp1 * tmp2 / 2; sum = -sum; } else{ n = abs(double(n)); m = abs(double(m)); if (n > m){ tmp1 = (n+m+1); tmp2 = (n-m); sum = tmp1 * tmp2 / 2; sum = -sum; } else{ tmp1 = (n+m+1); tmp2 = (m-n); sum = tmp1 * tmp2 / 2; } } printf("Scenario #%d:\n%lld\n\n", c, sum); } system("pause"); }
-
- 1
信息
- ID
- 1925
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者