c语言流程控制

目录

if语句重写时间差程序

switch-case

单一出口原则

while循环数位数

数字逆序

 do while

do while重写数位数

for循环

素数判断

数硬币程序

计算收敛函数

 循环的练习

整数分解

秋水仙数

最大公约数的几种求法

下一篇:c语言运算符


if语句重写时间差程序

 int hour1,minute1;

     int hour2,minute2;

     scanf_s("%d %d",&hour1,&minute1);

     scanf_s("%d %d",&hour2,&minute2);

    int ih=hour2-hour1;

    int im=minute2-minute1;

    if (im<0){

        im+=60;

        ih--;

    }

     printf("时间差是%d小时%d分钟",ih,im);

 

判断条件的优先级:所有的关系运算符优先级比算术运算的低,但是比赋值运算高

判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右的

例如:6>5>4的结果是0,从左往右6>5返回1而1<4

 

 

if语句的注意:如果if语句后面有分号则相当于

    if(exp)

;

{}

相当于if语句后面有一句什么都不做的语句

{}内相当于普通的语句

 

注意c语言中的if判断语句可以由单=构成,例如if(a=60),就永远是true,除非填入赋值语句a=0是false,不然都是true

switch-case

 

type必须是整数型int

常量可以是常数,也可以是常数计算的表达式,可以使用const int

如果没有break就会穿透

单一出口原则

例如:多个if语句都有一句相似的printf语句就不符合单一出口原则,应该在最后用一个printf语句输出

while循环数位数

 int x;

  int n=0;

  scanf_s("%d",&x);

  n++;//用于排除0

  x /=10;

  while (x!=0){

      n++;

      x /=10;

  }

  printf("%d\n",n);

  return 0;

 

 

调试还可以用printf调试法

 

数字逆序

  int x;

    scanf_s("%d",&x);

    int digit;

    int ret=0;

    while (x>0){

        digit=x%10;//取出低位

        printf("%d",digit);//700输入007

        ret=ret*10+digit;//将之前取出来的数*10在加上刚取出来的数

//        printf("ret=%d\n",ret);

        x/=10;

    }

    printf("\n");//换行

    printf("%d\n",ret);//700输入7

    return 0;

 do while

在进入循环的时候不做检查,而是在执行完一轮循环体的代码后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环

do

{

<循环体语句>

}while(<循环条件>);

与while的区别在于在循环体结束的时候才来判断条件,也就是说无论如何,循环都会执行至少一遍,再来判断条件

 

 

do while重写数位数

int x;

  int n=0;

  scanf_s("%d",&x);

    do {

        x /=10;

        n++;

    }while (x>0);

    printf("%d",n);

    return 0;

for循环

阶乘程序

    int n;

    scanf("%d",&n);

    int fact=1;

    for (int i = 2; i <= n; ++i) {//在for里面初始化i,是c99标准,有的编译器需要加上c99选项

        fact*=i;

    }

    printf("%d",fact);

 

 

优化

for (; n >1 ; n--) {

        fact *=n;

    }

 

小套路:求和程序的结果变量初始化应为0,求积程序应为1

 

 

tips for loop

如果有固定次数,用for

如果必须执行一次,用do_while

其他情况用while

 

素数判断

 int n;

    scanf("%d",&n);

    int i=2;

    for (i = 2; i < n; i++) {

        if (n%i==0){

            break;

        }

    }

    if (n==i){//走完for循环i一定=n

        printf("这是素数");

    } else{

        printf("这不是素数");

    }

 

接力break,设置一个flag变量判断是否break

 

 

或者goto

 

数硬币程序

 int x;

  int one,two,five;

  scanf("%d",&x);

    for (one=0;  one<x*10 ; one++) {

        for (two = 0;  two<x*10/2 ; two++) {

            for (five = 0; 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;

 

 

 

 

 

计算收敛函数

 int n;

 int i;

 double sum=0.0;

 double sign=1.0;

 scanf("%d",&n);

    for ( i = 1; i <= n; ++i) {

        sum+=sign/i;

        sign=-sign;//翻转正负

    }

    printf("f(%d)=%lf",n,sum);

    return 0;

 循环的练习

整数分解

 int x;

    //scanf("%d",&x);

    x=13425;

    int t=0;

    do{

        int d=x%10;

        t=t*10+d;

        x/=10;

    }while (x>0);

    //再翻转一遍还原但是每位数已被分开

    printf("t=%d\n",t);

    x=t;

    do{

        int d=x%10;//取出最后一位

        printf("%d",d);

        if (x>=10){

            printf(" ");//最后一个数字不输出空格

        }

        x/=10;//消除最后一位

    }while (x>0);

    printf("\n");

    return 0;

 

优化:基本思想,使用除以相同n位数的10^n得到最高位

    int x;

    //scanf("%d",&x);

    x=70000;

    int t=x;//用来代替x进行第一轮循环,避免消耗x

  int mask=1;

  //判断x的位数

  while(t>9){

      t/=10;

      mask*=10;

  }

  do{

      int d=x/mask;//得出最高位

      printf("%d",d);

      if (mask>9){//与下边条件不能是x>0同理

        printf(" ");

      }

          x%=mask;//去除最高位

      mask/=10;

  }while (mask>0);//这里如果是x>0的话,输入一个能整除的数循环就停止了

 

 

秋水仙数

 int n;

    scanf("%d",&n);

    n=3;

    int first=1;

    int i=1;

    while (i<n){

        first*=10;

        i++;

    }

    i=first;

    while (i<first*10)

    {

        int t=i;

        int sum=0;

        do {

            int d=t%10;

            t/=10;

            int p=d;

            int j=1;

            while (j<n){

                p*=d;

                j++;

            }

            sum+=p;

        }while (t>0);

        if (sum==i)

            printf("%d\n",i);

        i++;

    }

最大公约数的几种求法

 //基本思想,依次将取数从2到a和b之间较小的那个数,并用a和b除以这个数,记录下那个公约数
    int a,b;
    int min;
    scanf("%d %d",&a,&b);
    if (a<b)min=a;else min=b;
    int ret=0;//接收最大公约数
    for (int i=1; i <= min; ++i) {
		if (a%i==0&&b%i==0)
                ret=i;
    }
    printf("%d和%d的最大公约数是%d.\n",a,b,ret);

辗转相除法(欧几里得算法)
 int a,b,t;
   scanf("%d %d",&a,&b);
    while (b!=0){
        t=b;//暂存
        b=a%b;
        a=t;
        printf("a=%d",a);
        printf("b=%d",b);
        printf("\n");
    }
    printf("最大公约数是%d\n",a);
    return 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值