本文已参与[新人创作礼]活动,一起开启掘金创作之路
一.while循环
1.while循环的一般形式为:
while(表达式){
语句块
}
意思是,先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。
2.案例
求1+2+3+……10
int i,sum=0;
i=1; //规定初值
while(i<=10) //规定终值(或其他循环条件),无分号
{
sum+=i;
i++; //规定步长
}
当i=11的时候结束循环
二.do-while循环
1.do-while循环的一般形式为:
do{
循环体
}while(表达式);
do-while循环与while循环的不同在于:它会先执行“ 循环体”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
2.案例
求1+2+3+……10,do-while 循环的用法与while类似
int i,sum=0;
i=1; //规定初值
do
{
sum+=i;
i++; //规定步长
}while(i<=10); //规定终值(或其他循环条件),此行有分号
三.for循环
1.for 循环的一般形式为:
for(表达式1; 表达式2; 表达式3){
语句块
}
它的运行过程为:
- 先执行“表达式1”。
- 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
- 执行完循环体后再执行“表达式3”。
- 重复执行前两个步骤,直到“表达式2”的值为假,就结束循环。
“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。
2.案例
求1+2+3+……10,do-while 循环的用法与while类似
int i,sum=0;
for(i=1;i<=10;i++) //i++后面没有分号
{
sum+=i;
}
四.break,continue
程序中,有时候并不需要把设定的循环次数都执行完,而是需要提前结束循环或跳过一部分代码直接进入下一轮的循环,这时候用到break,continue。
1.break案例:
找出100~200之间第一个能被3和5都整除的数
没用break前
main() {
for (int i = 100; i <= 200; i++) {
if (i % 3 == 0 && i % 5 == 0) {
printf("%d\n", i);
}
}
}
发现与题意不合,并不是只找到了第一个能被3和5整除的数
break后
main() {
for (int i = 100; i <= 200; i++) {
if (i % 3 == 0 && i % 5 == 0) {
printf("%d\n", i); break;
}
}
}
2.continue案例
从键盘输入两个整数,求他们的最小公倍数
int m, n,i;
scanf_s("%d%d", &m,&n);
for (i = 1; i <= m * n; i++) {
if (i % m != 0) {
continue; //若除以m不尽,则转回到i+1换下一个数
}
if (i % n == 0)
{
break; //若除尽,意味着已经找到最小公倍数,跳出循环
}
}
printf("%d和%d的最小公倍数是:%d\n", m, n, i);
return 0;
五.例题
1.编程找出所有的水仙花数。水仙花数是三位数,它的3个数字的立方和等于本身 如:153=1*1*1+5*5*5+3*3*3。
int a, b, c;
for (int i = 100; i <= 999; i++) {
a = i % 10; //求个位上的数字
b = i / 10 % 10; //求出十位上的数字
c = i / 100; //求出百位上的数字
if (a * a * a + b * b * b + c * c * c == i) {
printf("%5d\n", i);
}
2.求m,n的最大公约数
辗转相除求最大公约数
先用大数作为被除数,小数作为除数,求余。如果余数不为0,则将原来的除数作为被除数,原来的余数作为除数,继续求余……,直到余数为0,最后一次求余的除数便是最大公约数。
例如:20和12两个数
20/12=1……8
12/8=1……4
8/4=2……0
则20和12的最大公约数为4
//辗转相除求最大公约数
int m, n, k; //k用来存储余数
scanf("%d%d", &m, &n);
if (m < n) { //若m<n则交换
int t; //在复合语句中也可以定义变量
t = m;
m = n;
n = t;
}
k = m % n;
while (k != 0) {
m = n; //上一次的除数作为被除数
n = k; //上一次的余数作为除数
k = m % n; //求余数
}
printf("最大公约数:%d\n", n); //最后一次的除数便是所求
return 0;