一、什么是循环,为什么需要循环
引例1-计算数位
给定一个正整数29835797775515656,计算该数是几位数
可以从右边开始划(29835797775515656/10)
划完一个数后结果加一(cnt++)
通过以前的知识可以写出代码
#include<stdio.h>
long long a=29835797775515656;
int cnt=0;
int main()
{
if(a>0)
{
a/=10;
cnt++;
if(a>0)
{
a/=10;
cnt++;
if(a>0)
{
a/=10;
cnt++;
}
...
...
...
}
}
printf("%d",cnt);
return 0;
}
由代码可以看出,当a>0时,需要不断地进行除以10和cnt++的操作
如果仅使用判断语句操作,会造成代码冗长,并且无法知道极限在哪里
这时就需要使用循环语句来进行操作
二、循环的种类
1、while循环
当判断语句已经解决不了引例1的问题时,这时就需要使用循环语句了
首先要试着使用while循环解决引例1的问题
while循环的本质是当循环条件满足时,不断重复循环体内的语句,且先判断,后执行
在引例1中,一个判断语句分支是这样的
if(a>0)
{
a/=10;
cnt++;
}
现在只需要把
i
f
if
if改成
w
h
i
l
e
while
while
即
while(a>0)
{
a/=10;
cnt++;
}
只要括号中条件为真,就可以循环执行这个判断语句,直到括号中条件为假,跳出循环
while循环流程图:
在while循环中的循环体中要有改变条件的机会,否则会造成死循环!!!
如果要计算所有整数的数位,上面的代码还是有些问题的,聪明的你知道问题在哪吗?
{如果输入为0,输出0,可以进行特判,也可以使用后面讲的do-while循环}
Tips:$while循环多用于已知循环条件的循环,注意与接下来的for循环进行对比
2、do-while循环
不同于
w
h
i
l
e
while
while循环的先判断后执行,
d
o
−
w
h
i
l
e
do-while
do−while循环的特点是先执行后判断
也就是说,在进入判断条件前会先执行循环体
do
{
<循环体语句>
}while(<循环条件>);///注意有个分号
样就可以解决输入0答案错误的问题了
3、for循环
已知阶乘
n
!
=
n
×
(
n
−
1
)
×
(
n
−
2
)
×
.
.
.
×
2
×
1
n!=n\times(n-1)\times(n-2)\times...\times2\times1
n!=n×(n−1)×(n−2)×...×2×1
如果我们要求出阶乘的值
用while循环可以这么写出代码
#include<stdio.h>
int main()
{
int a=1,n;
scanf("%d",&n);
int i=1;
while(i<=n)
{
a*=i;
i++;
}
printf("%d\n",a);
return 0;
}
如果写出了这样的循环,那么c语言中的for语句就可以代替while
#include<stdio.h>
int main()
{
int a=1,n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
a*=i;
}
printf("%d\n",a);
return 0;
}
在for语句中,圆括号中有三个表达式
表达式用分号隔开
表达式1:初始动作
表达式2:循环继续的条件
表达式3:循环每轮要做的动作
特别的,for循环的三个表达式每一个都是可以省略的
for(表达式1;表达式2;表达式3)
{
...;
}
T i p s Tips Tips做求和的程序,初值应赋值为0,求积应赋值为1
4、break与continue
当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,通常break语句总是与if语句联在一起,即满足条件时便跳出循环。
continue语句的作用是跳过循环体中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用。
5、时间复杂度
时间复杂度即事先预估时间开销T与数据规模n之间的关系
计算时间复杂度时,常用O()表示
当i从1~n循环,时间复杂度为O(n)
如果是1~n的二重循环,时间复杂度为O(
n
2
n^2
n2)
一般在计算时间复杂度时,只需考虑时间复杂度表达式的最高阶的时间开销
在算法竞赛中,通常1s可以执行1e8次循环,如果超过时间限制,则会返回TLE结果
三、如何选用循环
如果已知循环次数,一般选用for
如果必须做一次循环,使用do-while
其他情况使用while