入门 · 循环

1 到 N 求和

读入整数 N,输出 1 + 2 + … + N。经典的第一个 for 循环 — 里面还藏着一个以后再揭开的数学捷径。

一句话答案用 for 循环加一个累加器把 1 到 N 加起来;闭式 N(N+1)/2 一步就能算出同样的答案,而 N ≤ 10000 时和仍然在 int 范围内。

题目

输入: 一个整数 N(1 ≤ N ≤ 10,000)。

输出: 1 + 2 + … + N 的和。

样例:

输入输出
515(1+2+3+4+5)

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 累加器模式

需要一个从 0 开始、不断变大的变量:int sum = 0;,循环里 sum += i;。这个"累加器"模式占初学者题目的一半。

提示 2 — 循环边界

for (int i = 1; i <= n; i++) — 从 1 开始(0 加了也白加),到 <= n 结束(N 本身要算进去)。判题专测这种边界。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    cout << sum << endl;
    return 0;
}

循环用 N 步解决。著名的捷径:n * (n + 1) / 2 一步出答案(高斯九岁就会了)。注意那里的除法是整除 — 为什么重要见整数除法(英文)。下一题:三个数的最大值。

深度解析

为什么这样做对

累加器(total += i)是存在感最强的循环形状。换一道题,真正要回答的只有一个问题:每一轮往右边加什么。

代价

循环是 O(n);用高斯公式 n(n+1)/2 是 O(1)。n = 10000 时,一个是一万次加法,一个是三次算术运算。

常见错法

  • n * (n + 1) / 2 在 n 约 6.5 万时就溢出 int。先除以 2 再乘,或者直接上 long long。
  • 循环从 i = 0 起对求和无害,但对求积是致命的。每次都严格对齐题目给的范围。

下一步

把加改成乘:阶乘。

记住这两句

  • 累加器四步:初始化、循环、折入、返回。
  • n(n+1)/2 把 O(n) 变成 O(1)——闭式解永远赢循环。
🐞 这段是错的 —— 点开,亲手让它挂一次

i < n 把最后一项漏掉了

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int total = 0;
    for (int i = 1; i < n; i++) total += i;
    cout << total << endl;
    return 0;
}