@Bei-S
2020-09-05T10:00:43.000000Z
字数 2999
阅读 917
算法入门
循环主要用于处理重复执行一个代码块的情况。一般情况下,语句是按顺序进行的,即函数中第一个语句先进行,然后进行第二个,一次类推。而循环语句允许我们多次执行一个语句或者语句组,流程图如下
循环主要分为以下四大类
int i,a,b;
i=1,a=0,b=0;
while(i<=10){
i++;
a++;
b--;
}
这一段循环中我们的条件是i<=10,而i初始值为1,每次在循环语句中我们让i加1,因此这个循环语句回执行十次,而每次循环中a+1,b-1,最后a=10,b=-10。
for(int i=1;i<=10;i++){
a++,b--;
}
这一段循环和上面while循环达到的效果是一样的,但是我们可以看到for循环中有三个语句,他们分别表示
A.我们定义了一个变量i,并把它赋值为1(该语句只在进入for循环时执行1次)
B.这段循环的条件为i<=10,每次进入循环时都会判断是否满足该条件,如果不满足,就会跳出循环,如果我们把i赋值为11,那么这段语句就不会执行了。
C.每次循环结束后进行的操作,可以根据题目自己选择,我这里选择让i+1.
所以for循环的顺序为:
定义i,赋值i=1,判断i=1满足i<=10,进入语句,执行a++,b--,执行i++,判断i=2满足i<=10,进入语句,再次执行a++,b--,......直到i=11时会跳出循环。因此一共执行了10次
int i,a,b;
i=1,a=0,b=0;
do{
a++,b--;
}while(i<=10)
这一段大体同while循环,但是注意它是在结尾判断条件,这就意味着该语句至少会被执行一次,即如果我们把i赋值为11,语句会执行一次,a=1,b=-1。
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
a++,b--;
}
}
嵌套循环有多种嵌套,这里挑选for循环嵌套讲解。这个语句的意思就是在每次进行第一层关于i的循环时,会进行一次关于j从1到10的循环,代表每次执行一次第一层循环时,第二层循环都会执行10次,因此最终a=100,b=-100。嵌套循环的复杂度是相乘的,例如第一个循环n次,第二个循环为m次,那么时间复杂度就
嵌套循环一般情况下是用于处理二维相关问题的输入及输出。
以此类推,我们也可以进行多重嵌套以此来解决更多维的问题。
循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。
break语句为终止循环,程序将从当前循环跳出,直接进行下一个语句
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
a++,b--;
break;
}
}
cout<<a<<" "<<b;
如这一段嵌套循环,当进入j层循环时执行到break语句会跳出j层循环,因此每次j层循环只会进行一次a++,b--,因此最后a=10,b=-10。
但如果是如下写法
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
break;
a++,b--;
}
}
cout<<a<<" "<<b;
那每次执行a++和b--前会先进行break,最终a=b=0。
continue为停止本次循环,进入下一次循环
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(j%2==0) continue;
a++,b--;
}
}
cout<<a<<" "<<b;
这段语句代表当j是偶数时,停止本次循环,进入下一次,如j=2时,if中判断条件为true,执行continue,直接跳到执行j++,这时j=3.再次进入循环,而不满足if语句,执行a++,b--;
因此每次i循环会执行5次a++和b--,最后a=50,b=-50。
对比如下两端代码
A for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(j==3) continue;
a++,b--;
}
}
cout<<a<<" "<<b;
B for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
if(j==3) break;
a++,b--;
}
}
cout<<a<<" "<<b;
这两段中当执行到j层循环的j=3时,A模式会跳过j=3,直接执行j=4,因此每层i循环执行了9次a++,b--,
最终a=90,b=-90
而B模式在执行到j=3时,会直接跳出j循环,进入到i循环执行i++,因此每层i循环会执行2次a++,b--,最终a=20,b=-20
#include<bits/stdc++.h>
using namespace std;
int main(){
int l,r;//l,r为题目中所给需要求和的左右端点,l代表left,r代表ringt
int ans=0;//我们定义ans来记录最后的答案,同时因为局部变量定义后初值不一定为0,所以要赋值为0.
scanf("%d%d",&l,&r);
for(int i=l;i<=r;i++){
if(i%2==1) {//当满足i%2==1,及i除以2余1时,表示i为奇数,把答案加上i
ans=ans+i;
}
}
cout<<ans;
}
球弹跳高度的计算
while循环的写法:
#include<bits/stdc++.h>
using namespace std;
int main(){
double h,ans=0;
cin>>h;
int i=1;
while(i<=10){
if(i==1) ans=ans+h;//要注意题目上所说为求小球经过路程,因此第一次我们经过高度为h,之后每次落地间隔要一上一下,经过2*h
else ans=ans+h*2;
h=h/2;
i++;
}
cout<<ans<<endl<<h;
}
do-while写法如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
double h,ans=0;
cin>>h;
int i=1;
do{
if(i==1) ans=ans+h;//要注意题目上所说为求小球经过路程,因此第一次我们经过高度为h,之后每次落地间隔要一上一下,经过2*h
else ans=ans+h*2;
h=h/2;
i++;
}while(i<=10);
cout<<ans<<endl<<h;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){//第一层循环枚举我们当前要求谁的阶乘并累加
int k=1;//我们用k记录i!为多少
for(int j=1;j<=i;j++){
k=k*j;
}
ans=ans+k;
}
cout<<ans;
}