top1编程
← 返回题目
题解

数列求和

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4415 数列求和(入门)

    解题思路

    从1开始一项一项加:1、1+2、1+2+3……问加到第几项时总和第一次超过n。题目点名要求用do while。do while的特点是"先干活、后检查":不管条件成不成立,循环体都至少执行一次,非常适合"先加一项再判断够不够"的流程。我们准备两个变量:s存累计总和,i存当前加到第几项。循环里先执行 s+=i(把第i项加进去),再 i++(准备加下一项),然后检查 while(s<=n):只要总和还不大于n,就继续循环。循环结束时,s已经超过了n,而让s超过n的正好是第 i-1 项,所以输出 i-1。边界情况:n最小是2,第1项1不大于2,第2项1+2=3大于2,所以至少要加2项,循环不会出现只加一项就停的情况;n最大1000,加到第45项左右(1+2+…+45≈1035)就超过1000了,循环次数很少。

    参考代码

    // 程序用途:用do while计算1+2+3+...+i加到第几项时总和会大于n
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int s = 0, i = 1;               // s是当前总和,i是当前项数
        do {
            s += i;                     // 加上第i项
            i++;                        // 准备加下一项
        } while (s <= n);               // 总和还不大于n就继续
        cout << i - 1 << endl;          // 输出让总和超过n的那一项
        return 0;
    }
    

    复杂度分析

    因为 1+2+…+i ≈ i×(i+1)/2,要让总和超过n,i大约在 √(2n) 这个量级,所以循环次数约 O(√n)。n最大1000,最多几十次循环,非常快。额外空间只用两个变量,是 O(1)。

    • 1