5.2循环控制
素数
• 只能被1和⾃自己整除的数,不包括1
• 2, 3, 5, 7, 11,13,17, 19….
break vs continue
• break: 跳出循环
• continue: 跳过循环这一轮剩下的语句进入下一轮
break vs continue
嵌套的循环
100以内的素数
• 如何写程序输出100以内的素数?
#include <stdio.h>
int main()
{
int x;
for ( x=1; x<=100; x++ ) {
int i;
int isPrime = 1; // x是素数
for ( i=2; i<x; i++ ) {
if ( x % i == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime == 1 ) {
printf("%d ", x);
}
}
printf("\n");
return 0;
}
嵌套的循环
• 循环里面还是循环
#include <stdio.h>
int main()
{
int x;
scanf("%d", &x);
int i;
int isPrime = 1; // x是素数
for ( i=2; i<x; i++ ) {
if ( x % i == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime == 1 ) {
printf("是素数\n");
} else {
printf("不是素数\n");
}
return 0;
}
前50个素数
• 如何写程序输出前50个素数
#include <stdio.h>
int main()
{
int x;
int cnt = 0;
x = 1;
while ( cnt <50 ) {
int i;
int isPrime = 1; // x是素数
for ( i=2; i<x; i++ ) {
if ( x % i == 0 ) {
isPrime = 0;
break;
}
}
if ( isPrime == 1 ) {
cnt ++;
printf("%d\t", x);
if ( cnt %5 == 0 ) {
printf("\n");
}
}
x++;
}
return 0;
}
嵌套循环时的break
凑硬币
• 如何用1角、2角和5角的硬币凑出10元以下的金额呢?
#include <stdio.h>
int main()
{
int x;
int one, two, five;
scanf("%d", &x);
for ( one = 1; one < x*10; one++ ) {
for ( two = 1; two < x*10/2; two++ ) {
for ( five = 1; five < x*10/5; five++ ) {
if ( one + two*2 + five*5 == x*10 ) {
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",
one, two, five, x);
break;
}
}
}
}
return 0;
}
break和continue
• 只能对它所在的那层循环做
#include <stdio.h>
int main()
{
int x;
int one, two, five;
int exit = 0;
scanf("%d", &x);
for ( one = 1; one < x*10; one++ ) {
for ( two = 1; two < x*10/2; two++ ) {
for ( five = 1; five < x*10/5; five++ ) {
if ( one + two*2 + five*5 == x*10 ) {
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",
one, two, five, x);
exit = 1;
break;
}
}
if ( exit == 1 ) break;
}
if ( exit == 1 ) break;
}
return 0;
}
goto
#include <stdio.h>
int main()
{
int x;
int one, two, five;
scanf("%d", &x);
for ( one = 1; one < x*10; one++ ) {
for ( two = 1; two < x*10/2; two++ ) {
for ( five = 1; five < x*10/5; five++ ) {
if ( one + two*2 + five*5 == x*10 ) {
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",
one, two, five, x);
goto out;
}
}
}
}
out:
return 0;
}
思考题:
1、为什么老师说for循环很怪?
这是扩展的讨论,初学的同学可以围观看看,看不懂也没关系。
for循环是高级语言出现的第一种循环,它和现代的程序设计理念是否存在差距?为什么Python语言就没有C语言这种形式的for循环了?
形式差别:
-
从循环流程上来讲,一般是当条件为真,执行循环体。或者执行循环体后判断条件是否为真(具体见while与do-while循环),比较符合正常的逻辑思维;
-
for循环中不光有条件判断,还有初始化和循环体中的一些内容,初学时会有一定的干扰,习惯就好。
-
for(;条件表达式;;)可等效于while循环;
选择差别:
-
当循环次数已知,用for循环;
-
当循环次数未知:
-
循环条件在进行循环后明确,用do while语句;如求n!程序,只有在用户输入n的具体值后,判断条件才形成。
-
循环条件在进入循环前明确,用while语句。