1 条题解

  • 0
    @ 2025-5-22 16:06:53

    区间整数求和 - 解题思路

    这段代码计算给定区间[n, m]内所有整数的和,并处理各种可能的正负区间情况。

    算法核心思路

    1. 输入处理

      • 读取测试用例数量tc
      • 对于每个测试用例,读取区间端点n和m
    2. 分情况计算

      • 情况1:n和m都为正数
        • 使用等差数列求和公式:和 = (首项+末项)×项数/2
        • 计算项数 = m - n + 1
      • 情况2:n和m都为负数
        • 先取绝对值转换为正数区间
        • 使用同样公式计算后再取负值
      • 情况3:区间跨越0点
        • 根据n和m的绝对值大小关系分别处理
        • 计算正数部分和负数部分后合并结果
    3. 结果输出

      • 按照指定格式输出每个测试用例的结果
      • 包含场景编号和求和结果

    关键特点

    • 高效计算:利用等差数列公式直接求和,避免循环累加
    • 全面处理:覆盖所有可能的正负区间组合情况
    • 数学优化:通过绝对值转换简化计算过程
    • 格式规范:输出符合题目要求的格式
    #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
    上传者