0.引入
例子: 求100以内所有整数之和
int sum = 1 + 2 + 3 + ... + 100;
int sum = 0;
int i = 1;
sum = sum + i;
i++; //上述的两个语句重复100次
循环的本质就是重复, 所有重复的代码都可以使用循环来实现
在C语言中, 能够实现循环效果的语句:
while()
for()
do while()
goto
1.goto语句
goto 去哪儿
goto就是无条件的跳转语句, 让CPU到指定的地方去执行语句
语法:
行标识符:
....
goto 行标识符;
"行标识符": C合法的标识符, 用来标记某一行
行标识符一般是写在一行的最前面,允许行标识符前面有空白符(空格,tab)
例子:
求100以内所有整数之和
int sum = 0;
int i = 1;
loop:
sum = sum + i;
i++;
goto loop;
printf("sum = %d\n", sum );
上面的代码,是一个死循环
因此
一般goto语句是和 if语句 搭配使用,避免死循环
===>
int sum = 0;
int i = 1;
loop:
sum = sum + i;
i++;
if( i <= 100 )
{
goto loop;
}
printf("sum = %d\n", sum );
注意:
goto语句本身是没有任何问题的,但是goto语句过于灵活,是无条件跳转,导致程序的可读性变差
练习:
1) 请用goto语句实现 求100以内所有3的倍数之和
int sum = 0;
int i = 1;loop:
if( i%3 == 0 ) //3的倍数
{
sum = sum + i;
}
i++;if( i <= 100 )
{
goto loop;
}printf("sum = %d\n", sum );
方法二:
int sum = 0;
int i = 3;loop:
sum = sum + i;
i += 3;
if( i <= 100 )
{
goto loop;
}
printf("sum = %d\n", sum );
2.while()语句
语法:
while( 表达式 )
{
语句;
}
先判断"表达式"的值,如果为真(非0), 那么就执行语句, 执行完之后,
再次去判断"表达式"的值, ....
如果表达式的值为假(0), 退出循环
"表达式": 任意一种c语言合法的表达式都可以
"语句":
单语句: 只有一个;的语句
复合语句: 用{}括起来的语句
编程建议: 都把{}写上
例子:
求100以内所有整数之和
int sum = 0;
int i = 1;
while( i <= 100 )
{
sum = sum + i;
i++;
}
printf("sum = %d\n", sum );
练习:
1)用while语句, 实现逆序输出一个非负整数
输入: 12345
输出: 54321
x = num % 10; --> 5
num = num / 10; --> 1234
x = num % 10; --> 4
num = num / 10; --> 123
x = num % 10; --> 3
num = num / 10; --> 12
...
===>
int num;
scanf("%d", &num );int n = 0;
while( num )
{
//方法一: 单独打印每一个位
//int x = num % 10;
//printf("%d", x );//方法二:合成一个新的数
n = n * 10 + num%10;num = num / 10;
}
printf("%d\n", n );
3. do while 语句
语法:
do
{
语句;
}while( 表达式 );
先无条件的执行一次"语句", 再去判断"表达式"的值
如果表达式的值为真(非0), 那么就继续执行该"语句", 执行完之后, 再去判断表达式 ...
如果表达式的值为假(0), 则退出循环
"表达式": 任意一种c语言合法的表达式都可以
"语句": 单语句 或者 复合语句
编程建议: 都把{}写上
例子:
求100以内所有3的倍数之和
int sum = 0;
int i = 3;
do
{
sum = sum + i;
i = i + 3;
}while( i <= 100 );
printf("sum = %d\n", sum );
练习:
1)用 do while语句, 实现求n的阶乘 n!
例子:
5! = 1*2*3*4*5;
0! = 1;
1! = 1;
2! = 1*2;
3! = 1*2*3;
...
n! = ? ---> n! = 1*2*3*...*(n-1)*n;
===>
int n;
scanf("%d", &n );unsigned long s = 1;
if( n == 0 || n == 1 )
{
printf("%d! = %lu\n", n , s );
return 0;
}int i = 1;
do
{
s = s * i;
i++;
}while( i <= n );printf("%d! = %lu\n", n, s );
4.for()语句
语法:
for( 表达式1 ; 表达式2 ; 表达式3 )
{
语句;
}
首先,先无条件的执行一次"表达式1", 再去判断"表达式2"的值
如果"表达式2"的值为真(非0), 那么就执行语句, 再去执行"表达式3", 一次循环完毕;
从第二次循环开始,就不会再去执行"表达式1"了, 直接再去判断"表达式2"的值, ....
如果"表达式2"的值为假(0), 则退出循环
for循环 可以 等价于 while循环
==> 表达式1;
while( 表达式2 )
{
语句;
表达式3;
}
注意:
for()循环中的3个表达式都可以省略的, 但是 分号;一定不能省略
其中 如果"表达式2"为空, 意味着 是一个死循环
for(;;) <==> while(1) //死循环
while循环一般更加注重循环条件, for循环一般更注重循环次数(范围)
例子:
求100以内所有整数之和
int sum = 0;
int i;
for( i=1; i<=100; i++ )
{
sum = sum + i;
}
printf("sum = %d\n", sum );
练习:
1)打印 1000以内的所有的"水仙花数"
水仙花数: 是一个三位数, 且 个位,十位,百位的立方 之和 等于其本身
例如:
153 = 1*1*1 + 5*5*5 + 3*3*3
int i;
int g,s,b; //分别保存的个位,十位,百位for( i=100; i<1000; i++ )
{
g = i % 10; //个位
s = i /10 % 10; //十位
b = i / 100 % 10; //百位if( i == g*g*g + s*s*s + b*b*b )
{
printf("%d\n", i );
}
}
2)打印 0~20以内 不是3的倍数 的数
/*
int i;
for( i=0; i<20; i++ )
{
if( i%3 != 0 ) //不是3的倍数
{
printf("%d ", i );
}
}
putchar('\n');
*/int i;
for( i=0; i<20; i++ )
{
if( i%3 == 0 ) //是3的倍数
{
continue;
}
printf("%d ", i );
}
putchar('\n');
5. break 和 continue 的作用
1) break语句 只能用在 switch 和 循环语句(for/while/do while)中
break语句 在switch语句中的作用, 跳出它所在的switch语句
break语句 在循环语句中的作用, 用来跳出它所在的循环(结束循环) (一层)
2) continue语句 只能用在循环语句中
用来结束当前这一次循环,开始下一轮循环
练习:
1) 判断一个正整数是否为质数
质数: 除了1和它本身以外,不能被其他任何数整除int n;
scanf("%d", &n );int i;
for( i=2; i<n; i++ )
{
if( n%i == 0 )
{
printf("No\n");
return 0;
}
}
printf("Yes\n");
return 0;方法二: 标志位
int flag = 1; //1表示是质数, 0表示不是质数
int n;
scanf("%d", &n );int i;
for( i=2; i<n; i++ )
{
if( n%i == 0 )
{
flag = 0;
break;
}
}if( flag )
{
printf("Yes\n");
}
else
{
printf("No\n");
}
===================================
头文件的引用
#include <> 从系统标准的头文件路径下进行搜索 (如: /usr/include/ )
#include "" 先从当前的工程路径下进行搜索, 再从系统标准的头文件路径下进行搜索
练习:
1) 求表达式 Sn = a + aa + aaa + ... + aa....aaaaa(n个a)的值
其中 n和a的值 由键盘输入
例如:
n=5, a=2
Sn = 2 + 22 + 222 + 2222 + 22222
a1 = 2 a1 = a
a2 = 22 a2 = a1*10 + a
a3 = 222 a3 = a2*10 + a
a4 = 2222 a4 = a3*10 + a
...
an = a(n-1) * 10 + a
===>
int main()
{
int n,a;
scanf("%d%d", &n, &a );int Sn = 0;
int an = 0;int i;
for( i=0; i<n; i++ )
{
an = an * 10 + a;
Sn = Sn + an;
}printf("Sn = %d\n", Sn );
}
2) 求1000以内 所有的完数
完数: 除去这个数本身以外的 所有因子之和 等于其本身
例如:
6的因子 1,2,3 (6本身除外)
6 == 1+2+3
1)从1遍历到1000
2)求每一个数的所有因子之和 (本身除外)
3)判断因子之和是否等于其本身
4)满足条件就输出
int main()
{
int i,n;
int sum = 0;for( n=1; n<1000; n++ ) //从1遍历到1000
{
sum = 0; //每次计算新的因子之和 都需先清0for( i=1; i<n; i++ ) //找出n的所有因子(本身除外)
{
if( n%i == 0 )
{
sum += i;
}
}//判断因子之和是否等于其本身
if( sum == n )
{
printf("%d\n", n );
}
}
}
3) 一个正整数可能由n个连续的数相加得到的
比如:
15 = 1+2+3+4+5
15 = 4+5+6
15 = 7+8
从键盘上输入一个正整数n, 然后找出所有情况的连续数
方法一: 穷举法
1
1+2
1+2+3
1+2+3+4
1+2+3+4+5 == 15
以1开头找连续序列,一直累加,直到累加的结果等于15,那么就找到了,就输出这种情况
如果累加的结果 小于15, 就继续累加
如果累加的结果 大于15, 就结束循环, 从下一个数开始找
2
2+3
2+3+4
2+3+4+5
2+3+4+5+6 > 15 超过了,结束循环, 再从下一个数开始找
...
n/2
n/2 + (n/2 + 1)
(n/2 + 1)
(n/2 + 1) + (n/2 + 2 ) --> n+3 明显超过了n的 --> 遍历范围 [1, n/2]
标签:语句,10,int,sum,C语言,循环,printf,表达式,结构 From: https://blog.csdn.net/m0_69032433/article/details/142499988===>
int main()
{
int n;
scanf("%d", &n );int sum = 0;
int i,j,k;
for( i=1; i<=n/2; i++ ) // [1, n/2]
{
sum = 0;for( j=i; sum<n ; j++ ) //以i开头进行累加
{
sum += j;
if( sum == n )
{
//找到了
printf("%d = %d", n , i );
for( k=i+1; k<=j; k++ )
{
printf(" + %d", k );
}
putchar('\n');
}
}
}}
//方法二:int main()
{
int l; // left 第一个开始加的数
int r = 0; // right 下一个要加的数
int n;
scanf("%d", &n );int sum = 0;
int k;
for( l=1 ; l <= n/2 ; )
{
if( sum < n )
{
r++;
sum += r;
}
else if( sum == n )
{
//找到了
printf("%d = %d", n , l );
for( k=l+1; k<=r; k++ )
{
printf(" + %d", k );
}
putchar('\n');//当以l开头的相加的数输出完后, 开始下一次
sum = sum - l;
l++;
}
else if( sum > n )
{
sum = sum - l;
l++;
}
}}