(第一节)C语言记忆笔记(for、while、do..while、break、goto)

写的比较乱了,就是记忆笔记。

学习的是翁凯c语言,标题是《浙江大学翁凯教你C语言程序设计!C语言基础入门!》

1.循环控制

判断素数。(除了1和自己本身被整除,其他都无法整除)

int main(){
    int x;
    //scanf("%d",&x);

    x = 6;//用来测试的,把scanf注释掉了
    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放在循环体里面就结束,而不用等到完全结束循环。

break:跳出循环

continue:跳过循环这一轮剩下的语句进入下一轮。

int main(){
    int x;
    //scanf("%d",&x);

    x = 9;//用来测试的,把scanf注释掉了
    int i;
    int isPrime=1; // x是素数?
    for (i=2;i<x;i++){
        if (x % i == 0){
            isPrime=0;
            continue;//如果用了这个continue,那么就不会再往下执行那个printf,会回上面的for循环语句
        }
        printf("%d\n", i);
    }
    if ( isPrime == 1){
       printf("是素数\n");
    }else{
        printf("不是素数\n");
    }
    return 0;
}

100以内的素数输出。(嵌套的循环)

int main(){
    int x;
    
    // scanf("%d", &x);//这个注释掉了,用x=6来测试
    x = 6;//测试

    for (x=2;x<100;x++)//100以内的素数,1不是,就从x=2开始
    {
        int i;
        int isPrime = 1;//x是素数
        for ( i=2;i<x;i++){//for循环里面弄了个i,检测100以内的素数
            if (x%i==0){//X除以i的商为0的话,
                isPrime = 0;//那么x就不是素数
                break;//跳出循环,然后执行下面的语句
            }
        }
        if ( isPrime == 1){//如果X除以i的商不为0的话,就是 int isPrime = 1
            printf("%d ",x);//就把素数打印出来
        }
    }
    printf("\n");//隔开
    
    return 0;
}
//前五十个素数哈

int main(){
    int x;
    
    // scanf("%d", &x);//这个注释掉了,用x=6来测试
    x = 2;//测试
    int cnt=0;//计数器
    //for (x=2;x<100;x++)//100以内的素数,1不是,就从x=2开始
    //while(cnt<50)
    for (x=2; cnt<50;x++)
    {
        int i;
        int isPrime = 1;//x是素数
        for ( i=2;i<x;i++){//for循环里面弄了个i,检测100以内的素数
            if (x%i==0){//X除以i的商为0的话,
                isPrime = 0;//那么x就不是素数
                break;//跳出循环,然后执行下面的语句
            }
        }
        if ( isPrime == 1){//如果X除以i的商不为0的话,就是 int isPrime = 1
            printf("%d ",x);//就把素数打印出来
            cnt ++;//计数器要自增
        }
        // x++ //用for循环的时候就不用x++,用while的时候要
    }
    printf("\n");//隔开
    
    return 0;
}

凑硬币(如何用1角、2角、3角的硬币凑出10元以下的金额呢?)

int main(){
    int x;
    int one,two,five;
    
    //scanf("%d", &x);
    x = 2;//测试中
    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;如果只要一种结果,用break其实不行,为啥,因为break只会离开当前的for循环,也就是第三层的for(five = 1; five< x*10/5; five++ )循环,但是又继续回到了第二层的for循环,所以还是会出现很多种结果,它不能一下子跳出所有的循环。所以我们怎么跳出这个循环呢?请看下面的代码
                }
            }
        }
    }
       
    
    return 0;
}
int main(){
    int x;
    int one,two,five;
    int exit;
    //scanf("%d", &x);
    x = 2;//测试中
    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;//如果只单独放一个break在这,它只会跳出当前的第三个循环,它还是会继续回到第二个循环,so我们在break这边加一点的条件。
                }
            }
            if (exit ==1) break;//我们设置了一个可以跳出循环的条件
        }
        if (exit ==1) break;//这里也是
    }
       
    
    return 0;
}

它的名字叫:接力break!

当然,也可以用goto!好用!建议只在有多重循环的情况下用goto,

int main(){
    int x;
    int one,two,five;
    //scanf("%d", &x);
    x = 2;//测试中
    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;//go to 要去到下面的out!
                }
            }
        }
    }
       
out:    //在这,就是跳转到这里的out
    return 0;
}

前n项求和:就是1+1/2+1/3+1/4......+1/n

int main(){
    int n;
    int i;
    double sum=0.0;
    //scanf("%d", &n);
    n = 100//测试中
    for(i=1; i<=n; i++ ){
        sum +=1.0/i;
}
    printf("f(%d)=%f\n",n,sum);
    return 0;
}

但如果想实现1-1/2+1/3-1/4....怎么办?

int main(){
    int n;
    int i;
    double sum=0.0;
    int sign = 1;
    //scanf("%d", &n);
    n = 100//测试中
    for(i=1; i<=n; i++ ){
        sum +=sign*1.0/i;//这样就可以实现加一个减一个的效果了!
        sign=-sign;
}
    printf("f(%d)=%f\n",n,sum);
    return 0;
}

或者更妙的算法:

int main(){
    int n;
    int i;
    double sum=0.0;
    //int sign = 1;
    double sign=1.0;//在这里,直接用double,就不用*1.0了!

    scanf("%d", &n);
    
    for(i=1; i<=n; i++ ){
        sum +=sign/i;//这样就可以实现加一个减一个的效果了!
        sign=-sign;
}
    printf("f(%d)=%f\n",n,sum);
    return 0;
}

整数分解:(本集超级无敌晕,,,,,,,,)

正序分解整数:输入一个非负整数,正序输出它的每一位数字,输入13425,输出1 3 4 2 5,这个我没会,不要抄这个。是错误的!!!!!!

int main(){
    int x;
    scanf("%d",&x);

    x = 13425;

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

    return 0;
}

求最大公约数

辗转相除法

1.如果b等于0,计算结束,a就是最大公约数

2.否则,计算a除以b的余数,让a等于b,而b等于那个余数

3.回到第一步

//比如是a=12、b=18这样,求最大公约数,
//a b t
//12 18 12(12%18=12)
//18 12 6(18%12=6)换了个位置,让a=b
//12 6  0(12%6=0)
//6  0
int main()
{
    int a ,b;
    int t;
    scanf("%d %d", &a,&b);
    a=18;//测试
    b=12;//测试
    while ( b!=0 ) {
        t = a%b;
        a=b;
        b=t;
        printf("a=%d",b=%d,t=%d\n",a ,b ,t);    
}
    printf("gcd=%d\n", a);

    return 0;
}

求符合给定条件的整数集

给定不超过6的正整数A,考虑从A开始的连续4个数字,请输出所有由他们组成的无重复数字的三位数。

int main()
{
    int a;
    scanf("%d", &a);
    a=2//测试
    int i,j,k;
    int cnt= 0;
    i=a;
    while (i<=a+3){
        j = a;
        while (j<=a+3){
            k=a;
            while ( k<=a+3) {
                if (i!=j) {
                    if(i!=k){
                        if(j!=k) {
                            cnt++;//计数器累加
                            printf("%d %d%d",i,j,k);
                            if (cnt == 6 ){//这里的==6是因为每一行输出6个数
                                printf("\n");//然后空格
                                cnt = 0;//计数器清零
                            } else {
                                printf(" ");
                        }
                    }
                }
                k++;
                }
                j++;
            }
        i++;
    }    
    return 0;
}

水仙花数

水仙花数指的是一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,比如153=1的三次方+5的三次方+3的三次方,

要求是3<=N<=7,

按递增顺序输出的所有N位水仙花数,每个数字占一行,

比如输入3

输出=

153

370

371

//水仙花数
//水仙花数指的是一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,比如153=1的三次方+5的三次方+3的三次方,
//要求是3<=N<=7,
//按递增顺序输出的所有N位水仙花数,每个数字占一行,
//比如输入3
//输出=
//153
//370
//
#include <stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    n=3;//三位数
    int first = 1;
    int i = 1;
    while( i<n ) {
        first *=10;
        i++;
    }
    printf("first=%d\n", first);
    //遍历所有的三位数,100-999
    i=first;
    while (i<first*10) {
        int t = i;
        int sum = 0;
        do{
            int d = t%10;
            t/=10;
            int p = 1;
            int j = 0;
            while (j<n){
                p *= d;
                j++;
            }
            sum += p;
        }while (t >0 );
        if (sum==i){
            printf("%d\n",i);
        }
        i++;
    }
    return 0;
}

九九乘法表

//打印九九口诀表
#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    n=9;//测试,比如现在是99乘法表
    int i,j;
    i=1;
    while (i<=n) {
        j=1;
        while (j<=i){//当j是小于等于i的时候,那么,比如现在是1*1
            printf("%d*%d=%d",j,i,i*j);
            if (i*j <10 ){
                printf("   ");
            }else{
                printf("   ");
            }
            j++;
        }
        printf("\n");
        i++;
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值