for 循环的应用¶
累加¶
求 1 到 n 的和
sum += i,就是把这一轮的 i,加到之前的结果上。
比如 n = 3,每轮结束后,sum 依次是 1、3、6。
输入 n 个数,求它们的和
int n, x;
cin >> n;
long long sum = 0;
for (int i = 1; i <= n; i++) {
cin >> x;
sum += x;
}
cout << sum;
注意:这里加的是读入的 x,不是循环编号 i。
累乘¶
累加用 sum += i,累乘用 t *= i。
累加从 0 开始,累乘从 1 开始。
累乘若从 0 开始,后面乘什么都是 0。
求 n 的阶乘
n! 表示从 1 一直乘到 n,例如 4! = 1 × 2 × 3 × 4 = 24。
数学上约定 0! = 1。下面处理 0 <= n <= 20。
n = 4 时,每轮结束后,t 依次是 1、2、6、24。
n = 0 时,不进入循环,直接输出初始值 1。
常见的 32 位 int 放不下 13!,64 位 long long 放不下 21!,要注意范围。
求整数幂
a 的 k 次方,就是把 a 乘 k 次,不是从 1 乘到 k。
下面处理 1 <= a <= 10、0 <= k <= 18。
a = 2、k = 5,得到 32;k = 0,得到 1。
^ 不是乘方,是按位异或。pow 是浮点计算函数,这里的精确整数幂,用累乘就行。
输入 n 个数,求它们的乘积
int n;
cin >> n;
long long t = 1;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
t *= x;
}
cout << t;
这里乘的是读入的 x。每一步的乘积,都要能放进 long long。
循环输出¶
输出一个范围内的等差数列
// 首项1,末项15,公差2,输出1 3 5 7 9 11 13 15
int a1 = 1, an = 15, d = 2;
for (int i = a1; i <= an; i += d) {
cout << i << ' ';
}
输出等差数列的前 n 项
// 已知前两项1、3,输出前5项
int a1 = 1, a2 = 3, n = 5;
int d = a2 - a1;
for (int i = a1, j = 1; j <= n; j++, i += d) {
cout << i << ' ';
}
i 是当前项的值,j 负责计数第几项。这里循环 n 次,不靠数值大小判断结束。
输出一个范围内的等比数列
// 首项1,上限1024,公比2
int a1 = 1, an = 1024, q = 2;
for (int i = a1; i <= an; i *= q) {
cout << i << ' ';
}
这个例子从正数开始,公比大于 1,每次乘完都在 int 的范围内。
不能随便把公比改成 0 或 1,否则可能一直满足条件,循环停不下来。
输出等比数列的前 n 项
// 首项1,公比2,输出前5项
int a1 = 1, q = 2, n = 5;
for (int i = a1, j = 1; j <= n; j++, i *= q) {
cout << i << ' ';
}
斐波那契数列,循环迭代¶
已知数列 1, 1, 2, 3, 5, 8, ...,从第 3 项开始,每一项等于前两项之和。
求第 10 项
int a = 1, b = 1, c = 1;
for (int i = 3; i <= 10; i++) {
c = a + b;
a = b;
b = c;
}
cout << c; // 输出55
先用 a、b 算出下一项,再把两者往后挪一位。这种做法,叫循环迭代。
注意赋值顺序。 要先算 c,再更新 a、b,不能先把旧值覆盖掉。
如果改成求第 1 项或第 2 项,循环一次也不执行。
这里把 c 初始化为 1,所以这两种情况,也能得到正确结果。求更大的项时,要检查类型范围。
循环判断与计数¶
输出 1 到 n 的所有奇数
也可以从 1 开始,每次加 2:
输入 n 个数,统计奇数和偶数分别有多少个
int n, x, odd = 0, even = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x;
if (x % 2 != 0) {
odd++;
}
else {
even++;
}
}
cout << odd << ' ' << even;
判断奇数,用 x % 2 != 0。负奇数除以 2 的余数是 -1,不能只判断余数是否为 1。
循环求最值:打擂台¶
输入一组数,求最大值或最小值,可以让第一个数当“擂主”,后面的数依次挑战。
具体写法,见打擂台。
常见错误¶
累加、累乘的结果变量,放在循环外初始化
放在循环里面,每轮都会重新变回 0 或 1,前面的结果就没了。