1.循环控制
素数
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
int i;
for(i=2;i<x;i++){
if(x%i==0){
printf("不是素数\n");
}
}
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;
}
}
if(isPrime==1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
以x=6为例,执行多次for循环才出去,效率低
用break语句 跳出循环
#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;
}
break&continue
break:跳出循环
continue:跳过循环这一轮剩下的语句进入下一轮
#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;
continue;
}
printf("%d\n",i);
}
if(isPrime==1){
printf("是素数\n");
}else{
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;
continue;
}
printf("%d\n",i);
}
//if(isPrime==1){
if(i<x)
printf("不是素数\n");
}else{
printf("是素数\n");
}
return 0;
}
代码可读性下降
2.多重循环
2.1嵌套的循环:在循环里面还是循环
100以内的素数
如何写程序输出100以内的素数?
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
for(x=2;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("是素数\n");
}
}
printf("不是素数\n");
return 0;
}
循环内外的变量不能混淆
产生50个素数
#include<stdio.h>
int main()
{
int x;
x=2;
int cnt=0;
scanf("%d",&x);
//for(x=2;x<100;x++)
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){
printf("是素数\n");
cnt++;
}
x++;
}
printf("不是素数\n");
return 0;
}
也可以用for循环来做
#include<stdio.h>
int main()
{
int x;
x=2;
int cnt=0;
scanf("%d",&x);
for(x=2;cnt<50;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");
cnt++;
}
}
printf("不是素数\n");
return 0;
}
2.2从嵌套的循环中跳出: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;one<x*10/2;two++){
for(two=1;one<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;one<x*10/2;two++){
for(two=1;one<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;
}
以上为接力break,也可以用goto语句
goto后面接自己设定的标号,所跳到的地点
goto适合多重嵌套循环跳到最外侧的时候,建议只在这种情况下使用
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;one<x*10/2;two++){
for(two=1;one<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;
}
3.循环的应用
求前n项和
f(n)=1+1/2+1/3+1/4+…+1/n
#include<stdio.h>
int main()
{
int n;
int i;
double sum=0.0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=1.0/i;
}
printf("f(%d)=%f",n,sum);
return 0;
}
f(n)=1-1/2+1/3-1/4+…+1/n
#include<stdio.h>
int main()
{
int n;
int i;
double sum=0.0;
//int sign=1;
double sign=1.0;
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=sign/i;
sign=-sign;
}
printf("f(%d)=%f",n,sum);
return 0;
}
求最大公约数
输入两个数a和b,输出他们的最大公约数
枚举
int a,b;
int min;
scanf("%d %d",&a,&b);
if(a<b){
min+a;
}else{
min=b;
}
int ret=0;
int i;
for(i=1;i<min;i++){
if(a%i==0){
if(b%i==0){
ret=i;
}
}
}
printf("%d和%d的最大公约数是%d\n",a,b,ret);
辗转相除法
/*1.如果b等于0,计算结束,a就是最大公约数;
2.否则,计算a除以b的余数,让a等于b,而b等于那个余数;
3.回到第一步。
a b t
12 18 12
18 12 6
12 6 0
6 0
*/
#include<stdio.h>
int main()
{
int a,b;
int t;
scanf("%d %d",&a,&b);
while(b!=0){
t=a%b;
a=b;
b=t;
//printf("a=%d,b=%d,t=%d\n,a,b,t);
}
printf("gce=%d\n",a);
return 0;
}
正序分解整数
输入一个非负整数,正序输出它的每一位数字
逆序输出
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
do{
int d=x%10;
printf("%d ",d);
if(x>9){
printf(" ");
}
x/=10;
}while(x>0);
printf("\n");
return 0;
}
先逆序再逆序的只适合末尾没有0的数字
可用从最高位起除以10^n的方法
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
x=12345;
int cnt=0;
int mask=1;
int t=x;//避免x被消耗掉
while(t>9){
t/=10;
mask*=10;
cnt++;
}
printf("mask=%d\n",mask);
//int mask=pow(10,cnt-1);
do{
int d=x%10;
printf("%d ",d);
if(x>9){
printf(" ");
}
x/=10;
}while(x>0);
printf("\n");
return 0;
}