C语言——循环控制

本文介绍了C语言中的循环控制,包括多重循环、素数判断、break和continue的区别,以及循环在求和、求最小/最大公约数、整数分解等问题上的应用。此外,还提供了两个编程练习题目,涉及素数和的计算以及整数的汉语拼音输出。
摘要由CSDN通过智能技术生成

2020/5/10 C语言——循环控制

循环控制

判断素数

#include<stdio.h>

int main(){
    int x;
    int i=2;
    int isprime=1;//必须初始化1
    scanf("%d", &x);
    
    for( i=2; i<x; i++){
        if( x%i == 0){
           isprime = 0;
           break;
        }
    }
    
    if(isprime==0){
        printf("不是素数");
    }else{
        printf("是素数");
    }
    return 0;
}
   /*if(x<i){
        printf("不是素数");
    }else{
        printf("是素数");
    }*/

多重循环

一、输出100以内的素数
#include<stdio.h>

int main(){
    
    int x;
    
    for( x=2; x<100; x++){
        int i;
        int isprime=1;
        for( i=2; i<x; i++){
            if(x % i == 0){
                isprime = 0;
                break;
            }
        }
        if(isprime==1){
        printf("%d ",x);
        }
    }
    return 0;
}
输出前50个素数(加计数器)
法一:
#include<stdio.h>

int main(){
    
    int x;
    int count = 0;
    
    for( x=2; x<10000; x++){
        int i;
        int isprime=1;
        for( i=2; i<x; i++){
            if(x % i == 0){
                isprime = 0;
                break;
            }
        }
        if(isprime==1 && count<50){
        printf("%d ",x);
        count ++;
        }
    }
    return 0;
}
法二:
#include<stdio.h>

int main(){
    
    int x;
    int count = 0;
    
    for( x=2; count<50; x++){
        int i;
        int isprime=1;
        for( i=2; i<x; i++){
            if(x % i == 0){
                isprime = 0;
                break;
            }
        }
        if(isprime==1 ){
        printf("%d ",x);
        count ++;
        }
    }
    return 0;
}
拼钱数
#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*1+two*2+five*5==x*10){
                    printf("可以用%d个一角和%d个二角和%d个五角组成%d元\n", one, two, five, x);
                }
            }
        }
    }
    return 0;
}

运行结果是所有情况
在这里插入图片描述
若只需一种就可以,则:method1:接力break

#include<stdio.h>

int main(){
    
    int x;
    int exit=0;
    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*1+two*2+five*5==x*10){
                    printf("可以用%d个一角和%d个二角和%d个五角组成%d元\n", one, two, five, x);
                    exit = 1;
                    break;
                }
            if(exit) break;
            }
        if(exit) break;
        }
     if(exit) break;
    }
    return 0;
}

运行结果:
在这里插入图片描述
method 2: goto

#include<stdio.h>

int main(){
    
    int x;
    int exit=0;
    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*1+two*2+five*5==x*10){
                    printf("可以用%d个一角和%d个二角和%d个五角组成%d元\n", one, two, five, x);
                    goto out;
                }
            }
        }
    }
   out: return 0;
}

在这里插入图片描述

break和continue的区别

break是跳出本层循环
continue是跳出本次循环,也就是continue之后的内容不再执行,符合循环条件的下一次循环还会执行

循环应用

前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);
}

加减

#include<stdio.h>

int main(){
    
    int n;
    int i;
    int sign=1;
    double sum = 0.0;
    scanf("%d", &n);
    
    for(i=1; i<=n; i++){
        sum += sign*1.0/i;
        sign = -sign;
    }
    printf("f(%d)=%f",n,sum);
}
求最小公约数(枚举)
#include<stdio.h>

int main(){
    
   int a, b;
   scanf("%d %d",&a,&b);
   int min;
   
   if(a<b){
       min = a;
   }else{
       min = b;
   }
   
   int ret = 0;
   int i;
   for( i=1; i<min; i++){
       if(a%i==0 && b%i==0){
          ret=i;
          printf("%d和%d的最小公约数是%d\n",a,b,ret);
       }
   }
}
求最大公约数(枚举)
#include<stdio.h>

int main(){
    
   int a, b;
   scanf("%d %d",&a,&b);
   int min;
   
   if(a<b){
       min = a;
   }else{
       min = b;
   }
   
   int ret = 0;
   int i;
   for( i=1; i<min; i++){
       if(a%i==0 && b%i==0){
          ret=i;
        }
   }
   printf("%d和%d的最大公约数是%d\n",a,b,ret);
}
求最大公约数(辗转相除)

如下图所示,15和40 的最大公约数是 5
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>

int main(){
    
   int a, b;
   scanf("%d %d",&a,&b);
   int t;
   
   while(b!=0){
       t = a%b;
       a=b;
       b=t;
   }
   printf("最大公约数是%d\n",a);
}
整数分解
一、逆序输出各位数,要求两个数字之间有空格,最后一个数字之后没有空格,并和系统提示输入语句分开
#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;
}

在这里插入图片描述

二、逆序输出整个数
#include<stdio.h>

int main(){
    int x,t=0;
    scanf("%d", &x);
    
    do{
        int d = x%10;
        t = t*10+d;
        x /= 10;
    }while(x>0);
    printf("%d\n",t);
    x=t;
    do{
        int d = x%10;
        printf("%d", d);
        if(x>9){
            printf(" ");
        }
        x /= 10;
    }while(x>0);
     
    printf("\n");
    return 0;
}

在这里插入图片描述
实际上第二次应该输出7 0 0
在这里插入图片描述

三、改进
#include<stdio.h>

int main(){
    int x,mask = 1;
    scanf("%d", &x);
    int t = x;

    while (t>9){
        t /= 10;
        mask *= 10;
    }
   
    do{
        int d = x/mask;
        printf("%d", d);
        if(mask > 9){
            printf(" ");
        }
        x %= mask;
        mask /= 10;
    }while(x>0);
     
    printf("\n");
    return 0;
}

在这里插入图片描述

编程练习
素数和(5分)
题目内容:

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

输入格式:

输入两个整数,第一个表示n,第二个表示m。

输出格式:

一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。

输入样例:

2 4

输出样例:

15

时间限制:500ms内存限制:32000kb
#include<stdio.h>

int isPrime(int i,int a[],int count);    //判断素数函数
    
int main()
{
	int n,m;
	int a[200]={2};
	int count=1,i=3,sum=0;
	
	scanf("%d %d",&n,&m);
	
	while(count<m){    //制作一个含有m个素数的素数表
		if(isPrime(i,a,count)) a[count++]=i;
		i++;
	}
	
	for(i=n-1;i<m;i++){
		sum+=a[i];
	}
	
	printf("%d",sum);
	
	return 0;
} 

int isPrime(int x,int a[],int count)
{
	int ret=1;
	int i;
	
	for(i=0;i<count;i++){    //用已知素数去除当前数,判断是否为素数
		if(x%a[i]==0) {
			ret=0; break;
		}
	}
	
	return ret;
}
念整数(5分)
题目内容:

你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。

如输入1234,则输出:
yi er san si

注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi

输入格式:

一个整数,范围是[-100000,100000]。

输出格式:

表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。

输入样例:

-30

输出样例:

fu san ling

时间限制:500ms内存限制:32000kb
#include<stdio.h>

int main(){
    long int x;
    int a[6],i,n;
    i=0;n=0;
    
    scanf("%ld",&x);
    if(x<0) {
        printf("fu ");
        x=-x;
    }
    
    do{
        a[i]=x%10;
        i++;n++;
        x/=10;
    }while(x>0);

    for(i=n-1;i>=0;i--){
        switch(a[i]){
            case 0:printf("ling");break;
            case 1:printf("yi");break;
            case 2:printf("er");break;
            case 3:printf("san");break;
            case 4:printf("si");break;
            case 5:printf("wu");break;
            case 6:printf("liu");break;
            case 7:printf("qi");break;
            case 8:printf("ba");break;
            case 9:printf("jiu");break;
        }
        if(i>0) printf(" ");
    }

return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值