循环结构
循环结构
基本概念
循环结构是程序中用于重复执行某段代码的控制结构。当我们需要多次执行相同或相似的操作时,使用循环结构可以避免代码重复,使程序更加简洁高效。
循环结构代码的核心特点是:
-
重复执行某段代码,直到满足特定条件
-
通常包含初始化、循环条件判断和更新循环变量三个部分
在编程语言中,常见的循环结构有 for 循环和 while 循环两种基本形式。
for 循环
for 循环是一种常用的循环结构,通过维护一个循环控制变量,并不断判断循环控制变量是否满足某个特定条件,进而控制循环的进行。由于循环控制变量变化的范围在 for 循环中需要明确规定,for 循环的循环次数往往很轻松就能求出,所以它主要被用于明确知道循环次数的情境下。
循环控制变量是一个用于控制循环的变量,通过不断自我迭代变为新的数值。当循环控制变量不满足循环条件的时候,循环就会停止。循环控制变量的命名和一般变量的命名基本是一致的,但是也有一些约定:
- 由于循环控制变量在循环中一般会经常用到,所以往往大家倾向于取一个简短一点的名字。
- 在数学中,我们通常使用
依次作为 “循环控制变量” 的名称,例如
这个表达式,其中的
就类似于 “循环控制变量” 。在各大编程语言中,我们也会依次优先使用
作为 “循环控制变量” 的名称(和数学的习惯保持一致)。
C++ 中的 for 循环
在 C++ 中,for 循环的基本语法如下:
for (循环控制变量的初始化语句; 循环条件; 循环控制变量的更新语句) {
// 循环体,重复执行的代码
}
例如:
for (int i = 0; i < 5; i++) {
cout << i << " "; // 输出:0 1 2 3 4
}
for 循环的执行流程:
- 执行循环控制变量的初始化语句(
int i = 0
),只执行一次 - 判断循环条件(
i < 5
),如果为真,执行循环体;如果为假,退出循环 - 执行循环体内的代码
- 执行循环控制变量的更新语句(
i++
) - 返回第 2 步,重复执行
需要特别注意的是,在 C++ 中,for 循环的三个部分都可以省略,但是分号 ;
不能省略。例如:
int i = 0;
for (; i < 5;) {
cout << i << " "; // 输出:0 1 2 3 4
i++;
}
Java 中的 for 循环
在 Java 中,for 循环的语法与 C++ 基本相同:
for (循环控制变量的初始化语句; 循环条件; 循环控制变量的更新语句) {
// 循环体,重复执行的代码
}
例如:
for (int i = 0; i < 5; i++) {
System.out.print(i + " "); // 输出:0 1 2 3 4
}
for 循环的执行流程:
- 执行循环控制变量的初始化语句(
int i = 0
),只执行一次 - 判断循环条件(
i < 5
),如果为真,执行循环体;如果为假,退出循环 - 执行循环体内的代码
- 执行循环控制变量的更新语句(
i++
) - 返回第 2 步,重复执行
需要特别注意的是,在 Java 中,for 循环的三个部分都可以省略,但是分号 ;
不能省略。例如:
int i = 0;
for (; i < 5;) {
System.out.print(i + " "); // 输出:0 1 2 3 4
i++;
}
Python 中的 for 循环
Python 中的 for 循环与 C++ 和 Java 有所不同,它主要用于遍历可迭代对象(如列表、元组、字符串等)。此时,通过 for 循环,i 会依次自赋值为可迭代对象中的每个元素,然后执行循环体。当可迭代对象的每一个元素都被遍历完之后,循环就会结束。
for 变量 in 可迭代对象:
# 循环体,重复执行的代码
例如:
for i in range(5): # range(5) 生成包含 0,1,2,3,4 这五个数的序列
print(i, end=" ") # 输出:0 1 2 3 4
Python 中使用 range()
函数来生成一个一定范围的可迭代序列:
range(n)
: 生成 0 到 n-1 的整数序列range(start, end)
: 生成 start 到 end-1 的整数序列range(start, end, step)
: 生成 start 到 end-1 的整数序列,步长(即相邻两个数之间的差)为 step
例如: range(1,10,2) 生成的序列为 [1, 3, 5, 7, 9],range(1,10,3) 生成的序列为 [1, 4, 7]。
如果你想像 C++ 或 Java 的语法一样使用 Python 的代码,你可以参考下面的例子:
// 这是 C++/Java 中的 for 循环
for(int i=a;i<b;i+=c){
// 循环体,重复执行的代码
}
上面这段 C++/Java 代码等价于 Python 中的下面这段代码:
# 这是 Python 中的 for 循环
for i in range(a,b,c):
# 循环体,重复执行的代码
例题 1:多组输入 a+b II
题意
有 组数据,每组数据包含两个正整数
和
,请你输出对应的
的值。
思路
在此题中,我们已经明确地知道了数据组数为 ,所以可以直接使用 for 循环控制循环
次,每次输入两个整数并输出它们的和。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
int n; // 定义变量 n
cin >> n; // 输入 n
for (int i = 1; i <= n; i++) { // 循环 n 次
int a, b; // 定义变量 a 和 b
cin >> a >> b; // 输入 a 和 b
cout << a + b << endl; // 输出 a+b 的值
}
return 0; // 结束程序
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
int n = scanner.nextInt(); // 输入 n
for (int i = 1; i <= n; i++) { // 循环 n 次
int a = scanner.nextInt(); // 输入 a
int b = scanner.nextInt(); // 输入 b
System.out.println(a + b); // 输出 a+b 的值
}
scanner.close(); // 关闭Scanner对象
}
}
n = int(input()) # 输入 n
for i in range(1, n + 1): # 循环 n 次
a, b = map(int, input().split()) # 输入 a 和 b
print(a + b) # 输出 a+b 的值
while 循环
while 循环是另一种常用的循环结构,它在循环开始前检查条件,只要条件为真,就会重复执行循环体内的代码。由于不使用循环变量而只是单纯地判断循环条件,所以 while 循环的循环次数往往无法提前确定,所以它主要被用于知道循环进行的条件,但无法明确知道循环次数的情境下。
C++ 中的 while 循环
在 C++ 中,while 循环的基本语法如下:
while (循环条件) {
// 循环体,重复执行的代码
}
例如:
int i = 0;
while (i < 5) {
cout << i << " "; // 输出:0 1 2 3 4
i++;
}
while 循环的执行流程:
- 判断循环条件(
i < 5
),如果为真,执行循环体;如果为假,退出循环 - 执行循环体内的代码
- 返回第 1 步,重复执行
Java 中的 while 循环
在 Java 中,while 循环的语法与 C++ 基本相同:
while (循环条件) {
// 循环体,重复执行的代码
}
例如:
int i = 0;
while (i < 5) {
System.out.print(i + " "); // 输出:0 1 2 3 4
i++;
}
while 循环的执行流程:
- 判断循环条件(
i < 5
),如果为真,执行循环体;如果为假,退出循环 - 执行循环体内的代码
- 返回第 1 步,重复执行
Python 中的 while 循环
Python 中的 while 循环与 C++ 和 Java 类似:
while 循环条件:
# 循环体,重复执行的代码
例如:
i = 0
while i < 5:
print(i, end=" ") # 输出:0 1 2 3 4
i += 1
while 循环的执行流程:
- 判断循环条件(
i < 5
),如果为真,执行循环体;如果为假,退出循环 - 执行循环体内的代码
- 返回第 1 步,重复执行
例题 2:多组数据 a+b III
题意
有若干组数据,每组数据包含两个正整数 和
,请你输出对应的
的值。如果输入的两个整数均为
,则标志着上一组数据是最后一组数据,程序到这里已经处理完了所有的数据,可以停止运行了。
思路
此题与例题一不同的是,我们在程序开始时并不能直接知道测试数据的组数,也就不能知道循环要执行的具体次数,此时我们可以使用 while 循环来解决这个问题。我们可以先输入一组 和
,然后用 while 循环来判断
和
是否同时为
,如果是,则退出循环;否则,在我们输出完两数之和
后,继续输入下一组
和
,然后依次循环即可。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
int a, b; // 定义变量 a 和 b
cin >> a >> b; // 输入 a 和 b
while (a != 0 || b != 0) { // 当 a 和 b 均不为 0 时
cout << a + b << endl; // 输出 a+b 的值
cin >> a >> b; // 输入下一组 a 和 b
}
return 0; // 结束程序
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
int a = scanner.nextInt(); // 输入 a
int b = scanner.nextInt(); // 输入 b
while (a != 0 || b != 0) { // 当 a 和 b 均不为 0 时
System.out.println(a + b); // 输出 a+b 的值
a = scanner.nextInt(); // 输入下一组 a
b = scanner.nextInt(); // 输入下一组 b
}
scanner.close(); // 关闭Scanner对象
}
}
a, b = map(int, input().split()) # 输入 a 和 b
while a != 0 or b != 0: # 当 a 和 b 均不为 0 时
print(a + b) # 输出 a+b 的值
a, b = map(int, input().split()) # 输入下一组 a 和 b
循环控制语句
在循环结构中,有时我们需要更灵活地控制循环的执行流程。常用的循环控制语句有 break 和 continue,他们在各个编程语言中的作用基本是完全一样的,但为了方便各个语言的选手理解,我们针对 C++、Java 和 Python 三种语言分别进行了举例。
break 语句
break 语句用于立即退出当前循环,不再执行循环中的剩余语句。它通常与条件判断一起使用,当满足某个条件时,提前结束循环。
C++ 中的 break
// 在 C++ 中使用 break 查找数组中的特定元素
int arr[] = {3, 7, 2, 9, 5};
int target = 9;
int position = -1;
for (int i = 0; i < 5; i++) {
if (arr[i] == target) {
position = i;
break; // 找到目标元素后立即退出循环
}
}
if (position != -1) {
cout << "找到元素,位置是: " << position << endl;
} else {
cout << "未找到元素" << endl;
}
Java 中的 break
// 在 Java 中使用 break 查找数组中的特定元素
int[] arr = {3, 7, 2, 9, 5};
int target = 9;
int position = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
position = i;
break; // 找到目标元素后立即退出循环
}
}
if (position != -1) {
System.out.println("找到元素,位置是: " + position);
} else {
System.out.println("未找到元素");
}
Python 中的 break
# 在 Python 中使用 break 查找列表中的特定元素
arr = [3, 7, 2, 9, 5]
target = 9
position = -1
for i in range(len(arr)):
if arr[i] == target:
position = i
break # 找到目标元素后立即退出循环
if position != -1:
print(f"找到元素,位置是: {position}")
else:
print("未找到元素")
continue 语句
continue 语句用于跳过当前循环的剩余语句,直接进入下一次循环。它通常用于当某个条件满足时,跳过当前迭代,继续下一次迭代。
C++ 中的 continue
// 在 C++ 中使用 continue 打印 1 到 10 中的奇数
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) { // 如果 i 是偶数
continue; // 跳过当前循环
}
cout << i << " "; // 只打印奇数
}
// 输出: 1 3 5 7 9
Java 中的 continue
// 在 Java 中使用 continue 打印 1 到 10 中的奇数
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) { // 如果 i 是偶数
continue; // 跳过当前循环
}
System.out.print(i + " "); // 只打印奇数
}
// 输出: 1 3 5 7 9
Python 中的 continue
# 在 Python 中使用 continue 打印 1 到 10 中的奇数
for i in range(1, 11):
if i % 2 == 0: # 如果 i 是偶数
continue # 跳过当前循环
print(i, end=" ") # 只打印奇数
# 输出: 1 3 5 7 9
嵌套循环
循环结构可以嵌套使用,即在一个循环内部包含另一个循环。嵌套循环通常用于处理多维数据或需要多层迭代的问题。同样,循环结构里面也可以包含选择结构语句,进而形成非常复杂的逻辑。
比如说,我们要打印一个长这个样的九九乘法表:
(提示:\t
是制表符,用于让输出的内容像表格一样对齐)
// 在 C++ 中使用嵌套循环打印乘法表
for (int i = 1; i <= 9; i++) { // 外层循环控制行
for (int j = 1; j <= i; j++) { // 内层循环控制列
cout << j << "*" << i << "=" << i*j << "\t";
}
cout << endl; // 每行结束后换行
}
// 在 Java 中使用嵌套循环打印乘法表
for (int i = 1; i <= 9; i++) { // 外层循环控制行
for (int j = 1; j <= i; j++) { // 内层循环控制列
System.out.print(j + "*" + i + "=" + (i*j) + "\t");
}
System.out.println(); // 每行结束后换行
}
# 在 Python 中使用嵌套循环打印乘法表
for i in range(1, 10): # 外层循环控制行
for j in range(1, i+1): # 内层循环控制列
print(f"{j}*{i}={i*j}", end="\t")
print() # 每行结束后换行
例题3:素数判断
题意
有 个数字,你需要依次判断每个数字是否为素数。
思路
首先,我们要循环 次,每次输入一个数字
,然后判断
是否为素数。
判断一个数是否为素数,我们可以用试除法,即从 开始,一直试到
(由于因子都是成对出现的,所以其实完全不用试到
,试到
其实就够了),如果在这个范围内都没有找到
的因子,那么
就是素数。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
int T; // 定义变量 T
cin >> T; // 输入 T
for (int i = 1; i <= T; i++) { // 循环 T 次
int n; // 定义变量 n
cin >> n; // 输入 n
if (n == 1) { // 如果 n 等于 1
cout << "No" << endl; // 特殊的,1 不是质数也不是合数,输出 No
continue; // 结束当前循环,进入下一次循环
}
bool is_prime = true; // 定义变量 is_prime,表示 n 是否为素数
// 我们先假设 n 是素数,接下来尝试可能的因子,如果发现 n 有因子,再认为 n 不是素数
for (int j = 2; j < n; j++) { // 从 2 开始试到 n-1
if (n % j == 0) { // 如果 n 能被 j 整除
is_prime = false; // 那么 n 不是素数
break; // 跳出循环
}
}
if (is_prime) { // 如果 n 是素数
cout << "Yes" << endl; // 输出 Yes
} else { // 如果 n 不是素数
cout << "No" << endl; // 输出 No
}
}
return 0; // 结束程序
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象
int T = scanner.nextInt(); // 输入 T
for (int i = 1; i <= T; i++) { // 循环 T 次
int n = scanner.nextInt(); // 输入 n
if (n == 1) { // 如果 n 等于 1
System.out.println("No"); // 特殊的,1 不是质数也不是合数,输出 No
continue; // 结束当前循环,进入下一次循环
}
boolean isPrime = true; // 定义变量 isPrime,表示 n 是否为素数
// 我们先假设 n 是素数,接下来尝试可能的因子,如果发现 n 有因子,再认为 n 不是素数
for (int j = 2; j < n; j++) { // 从 2 开始试到 n-1
if (n % j == 0) { // 如果 n 能被 j 整除
isPrime = false; // 那么 n 不是素数
break; // 跳出循环
}
}
if (isPrime) { // 如果 n 是素数
System.out.println("Yes"); // 输出 Yes
} else { // 如果 n 不是素数
System.out.println("No"); // 输出 No
}
}
scanner.close(); // 关闭Scanner对象
}
}
T = int(input()) # 输入 T
for i in range(1, T + 1): # 循环 T 次
n = int(input()) # 输入 n
if n == 1: # 如果 n 等于 1
print("No") # 特殊的,1 不是质数也不是合数,输出 No
continue # 结束当前循环,进入下一次循环
is_prime = True # 定义变量 is_prime,表示 n 是否为素数
# 我们先假设 n 是素数,接下来尝试可能的因子,如果发现 n 有因子,再认为 n 不是素数
for j in range(2, n): # 从 2 开始试到 n-1
if n % j == 0: # 如果 n 能被 j 整除
is_prime = False # 那么 n 不是素数
break # 跳出循环
if is_prime: # 如果 n 是素数
print("Yes") # 输出 Yes
else: # 如果 n 不是素数
print("No") # 输出 No
课后习题
汗牛充栋,学海无涯。<br/> 内含算法知识点讲解,以及牛客题库精选例题。<br/> 学习算法,从牛栋开始。