循环结构 NEAU ACM-ICPC TEAM 主讲人:NEAU_ACM_Team
目录 1 循环结构 2 while循环 3 for循环 4 continue与break 5 双层循环
循环结构 PART 01 为什么要循环?
太过复杂!!! 如果我们想要在屏幕上输出1~10 十个数字,我们应该这么做呢? #include<stdio.h> int main() { return 0; } 太过复杂!!! printf(“1\n”); printf(“2\n”); printf(“3\n”); printf(“4\n”); printf(“5\n”); printf(“6\n”); printf(“7\n”); printf(“8\n”); printf(“9\n”); printf(“10\n”);
如果我们想要在屏幕上输出1~10 十个数字,我们应该这么做呢? #include<stdio.h> int main() { 开始 int i=1 i<=10 printf i i++ 结束 真 假 #include<stdio.h> int main() { int i=1; while(i<=10) printf("%d\n",i); i++; } return 0; 如果我们想要在屏幕上输出1~10 十个数字,我们应该这么做呢?
目录 1 循环结构 2 while循环 3 for循环 4 continue与break 5 双层循环
while循环 PART 02 一直做下去
真 假 ①②①② ··· ··· ①②①②① #include<stdio.h> int main() { while循环 #include<stdio.h> int main() { while(表达式①) 语句②; } …; return 0; 真 假 开始 int i=1 i<=10 printf i i++ 结束 真 假 循环体的概念 表达式为假 循环结束 ①②①② ··· ··· ①②①②①
练习&答疑 Problem 如果我们想要在屏幕上输出1~10 十个数字,我们应该这么做呢?
死循环 时间超限 ①②①②①②①② ··· ··· #include<stdio.h> int main() { while循环 死循环 #include<stdio.h> int main() { while(1+1==2) printf("1+1!=2\n"); return 0; } 时间超限 表达式用不为假 循环永不结束 需要使循环趋向于结束 ①②①②①②①② ··· ···
Problem 练习&答疑 输入一个整数n,使等差数列{1,2,3,4,5…}前m项的和大于n,输出最小的m。 样例输入 10 样例输出 5 提示 1+2+3+4=10 1+2+3+4+5=15
#include<stdio.h> int main() { int t,a,b; scanf("%d",&t); while(t--) scanf("%d%d",&a,&b); printf("%d\n",a+b); } return 0; 循环输入 #include<stdio.h> int main() { int a,b; while(~scanf("%d%d",&a,&b)) printf("%d\n",a+b); return 0; } #include<stdio.h> int main() { int a,b; while(~scanf("%d%d",&a,&b)) printf("%d\n",a+b); return 0; } scanf的值为输入变量的个数 如遇文件结尾,则返回-1 每次循环t减小1,t次循环后, t减小为0,循环结束 #include<stdio.h> int main() { int t,a,b; scanf("%d",&t); while(t--) scanf("%d%d",&a,&b); printf("%d\n",a+b); } return 0;
do-while 真 假 ① ② ①②①② ··· ··· ①②①② 至少执行一次循环体 while循环 #include<stdio.h> int main() { int i=1; while(i<=10) printf("%d\n",i); i++; } return 0; #include<stdio.h> int main() { int i=100; while(i<=10) printf("%d\n",i); i++; } return 0; do-while while循环 #include<stdio.h> int main() { do 语句; } while(表达式); …; return 0; 真 假 ① ② 至少执行一次循环体 #include<stdio.h> int main() { int i=1; do printf("%d\n",i); i++; } while(i<=10); return 0; #include<stdio.h> int main() { int i=100; do printf("%d\n",i); i++; } while(i<=10); return 0; 表达式为假 循环结束 ①②①② ··· ··· ①②①②
目录 1 循环结构 2 while循环 3 for循环 4 continue与break 5 双层循环
for循环 PART 03 一直做下去
真 假 ①②④③②④③②④③…② #include<stdio.h> int main() { for循环 #include<stdio.h> int main() { for(语句① ;语句② ;语句③ ) 语句④; } …; return 0; 真 假 开始 int i=1 i<=10 printf i i++ 结束 真 假 表达式为假 循环结束 ①②④③②④③②④③…②
Problem 练习&答疑 输入一个整数n,输出n! 样例输入 5 样例输出 120 提示 n!=1*2*3…*n,0!=1。
Problem 练习&答疑 输入一个整数n,从大到小输出n的所有因子,每行一个。 样例输入 12 样例输出 6 4 3 2 1
目录 1 循环结构 2 while循环 3 for循环 4 continue与break 5 双层循环
continue与break PART 04 停止循环
continue break 结束当次循环 结束当前循环 continue与break #include<stdio.h> int main() { int i; for(i=1;i<=10;i++) printf("\n"); printf("continue 之前 i=%d\n",i); if(i%3==0) continue; printf("continue 之后 i=%d\n",i); } return 0; #include<stdio.h> int main() { int i; for(i=1;i<=10;i++) printf("\n"); printf("break 之前 i=%d\n",i); if(i%3==0) break; printf("break 之后 i=%d\n",i); } return 0;
Problem 练习&答疑 敲三 一群人围成一圈,从1开始报数,遇见3的倍数和带3的数字不报数而是拍手一次,游戏将会在拍手n次之后结束。请输出游戏过程中报出的数字,每个一行。(游戏结束时数字小于100) 样例输入 5 样例输出 1 2 4 7 8 10 11 提示 1,2,x,4,5,x,7,8,x,10,11,x,x.
目录 1 循环结构 2 while循环 3 for循环 4 continue与break 5 双层循环
双层循环 PART 05 循环嵌套
双层循环的执行顺序 双层循环 #include<stdio.h> int main() { int i,j; for(i=1;i<=3;i++) printf("第%d次外层循环\n",i); for(j=1;j<=4;j++) printf(" 第%d次内层循环\n",j); } printf("\n"); return 0;
Problem 练习&答疑 打印矩形 输入两个数n,m,输出n行m列的实心矩形 样例输入 3 4 样例输出 ****
Problem 练习&答疑 打印九九乘法表 为图形美观,乘积占两格宽度,注意行末没有空格 1*1= 1 1*2= 2 2*2= 4 1*3= 3 2*3= 6 3*3= 9 1*4= 4 2*4= 8 3*4=12 4*4=16 1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
双层循环中使用continue与break 在内层循环里使用仅作用于内层循环
Problem 练习&答疑 打印三角形 输入一个整数n,输出大小为n的三角形 样例输入 3 样例输出
Problem 练习&答疑 输入n,m(0<=n<=200,0<=m<=10000)。 求两个整数a,b使a+b=n且a*b=m,要求0<=a,b<=100,若存在多个满足要求的a,输出最小的a,若a为最小时有多个满足要求的b,输出最小的b。若没有满足要求的a和b,则输出“-1”。 样例输入 2 1 样例输出 1 1
Problem 练习&答疑 素数的个数 输入一个整数n,求不大于n的素数个数 样例输入 10 样例输出 4 提示 2,3,5,7
1S 108 2S 109 时间复杂度 优化算法 降低时间复杂度 O(1) O(n) O(n2) 时间复杂度O(n*m) 执行算法所需要的计算工作量 双层循环 优化算法 降低时间复杂度 for(i=0;i<n;i++) { for(j=0;j<m;j++) ...; } #include<stdio.h> int main() { int n,i,j,flag,ans; scanf("%d",&n); ans=0; for(i=2;i<=n;i++) flag=0; for(j=2;j<i;j++) if(i%j==0) flag=1; break; } if(flag==0) ans++; printf("%d\n",ans); return 0; #include<stdio.h> int main() { int n,i,sum; scanf("%d",&n); sum=0; for(i=1;i<=n;i++) sum+=i; printf("%d\n",sum); return 0; } O(1) 1S 108 2S 109 #include<stdio.h> int main() { int n,sum; scanf("%d",&n); sum=n*(n+1)/2; printf("%d\n",sum); return 0; } O(n) O(n2) 时间复杂度O(n*m)
感谢观看 THANKS NEAU ACM-ICPC TEAM