条件语句与循环语句实战

上个博客 http://t.csdn.cn/b5bIt  初步了解了条件语句与循环语句的结构,这篇博客进行实战练习

目录

实战一:n的阶乘

实战二:阶乘的加和

实战三:使三个数倒序排列

实战四:输出1到100以内能被三整除的整数

实战五:求最大公约数

实战六:求闰年

实战七:找素数(难)

实战八:判断1~100内有几个9(99按两个9计数)

实战九:分数求和

实战十:9*9乘法口诀表


实战一:n的阶乘

#include //n的阶乘
int main()
{
    int i=0;
    int n=0;
    int ret=1;
    scanf("%d",&n);   
    for(i=1;i<=n;i++)
    {
        ret=ret*i;
    }
      printf("ret=%d",ret);
   return 0; 
}

实战二:阶乘的加和

#include//答案是错误的:15
 int main()
 {
   int i=0;
   int n=0;
   int ret=1;
   int sum=0;
   for(n=1;n<=3;n++)
   {
      for(i=1;i<=n;i++)
      {
          ret=ret*i;
      }
      sum=sum+ret;
   }
   printf("sum=%d",sum);
   return 0;
}

注意事项:

第一个程序出现错误是对两个for循环嵌套不理解,3的阶乘+2的阶乘+1的阶乘=9,但输出却为15,具体原因

1.ret=1*1=1

2.ret=1*1*1*2=2

3.ret=1*1*1*2*1*2*3=12

所以解决办法为在第一个和第二个for循环之间, 重置ret=1

优化代码

上面代码虽然便于理解,但还是去有些繁琐重复效率不高,具体解释为每次都得重复画底线的部分

#include//优化后

 int main()

 {

   int n=0;

   int ret=1;

   int sum=0;

   for(n=1;n<=3;n++)

      {

          ret=ret*n;

          sum=sum+ret;

      }

   printf("sum=%d",sum);

   return 0;

}

实战三:使三个数倒序排列

#include
int main()
{ 
   int a=0,b=0,c=0;
   scanf("%d %d %d",&a,&b,&c);
//算法实现:a,b,c大小一次递减
   if(a
注意事项:输入三个数时中间要加空格,否则计算机会以为是一个多位数,例4 1 3而不是413

实战四:输出1到100以内能被三整除的整数

#include//被三整除
int main()
{
   int i=0;
   for(i=1;i<=100;i++)
   {
      if(i%3==0)
      printf("%d ",i);
   }
   return 0;
}

提示:%是取余数的意思,例7➗3=2…1故7%3=1


实战五:求最大公约数

使用的方法是辗转相除法

例如:假如需要求 100 和18 两个正整数的最大公约数,是这样进行的:

100 / 18 = 5 (余 10)

18 / 10= 1(余8)

10 / 8 = 1(余2)

8 / 2 = 4 (余0)

至此,最大公约数为2

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 100 和 18 的最大公约数2。

最小公倍数求法:

原来的两个整数相乘,再除以最大公约数

例如:100✖️18➗2

#include//求最大公约数
int main()
{
   int m=24;
   int n=18;
   int r=0;
   while(m%n)//若非0则为真,继续循环
   {
      r=m%n;
      m=n;
      n=r;
   }  
    printf("%d",n);
   return 0; 
}

一点建议:while(m%n)和下面的r=m%n;重复计算了m%n无疑重复效率底下,优化后如下

#include//求最大公约数优化
int main()
{
   int m=24;
   int n=18;
   int r=0;
   while(r=m%n)
   {
      m=n;
      n=r;
   }  
    printf("%d",n);
   return 0; 
}

实战六:求闰年

#include//求闰年
int main()
{
    int year=0;
    int count=0;
    for(year=1949;year<=2022;year++)
    {
      if(year%4==0&&year%100!=0)
      {
         count++;
         printf("%d ",year);
      }
      if(year%400==0) 
      {
         count++;
         printf("%d ",year);
      }
        
    }
    printf("\n闰年的个数是%d",count);
   return 0;
}

闰年判断条件同时满足:

1、能被4整除且不能被100整除 

2、能被400整除


实战七:找素数(难)

我们分多步骤进行讲解

素数概念:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

我们的思路是试除法,定义一个整数i=13,再产生2到12内的所有整数,让前者与后者取模,能整除的(14%7=0)就不为素数,要舍去。当然素数求解的方法有很多,这只是对其中的一种进行剖析

#include//过程一

int main()

{

    int i=13;

    int j=0;

    for(j=2;j

这个代码其实是有bug的,如果i≠13,而是一个合数14…,照样能输出,问题就出在循环上

跳出循环,输出i值有两种方式。

第一种:若是一个素数,例如,13试遍了2到12内的所有数都不能整除就会跳出循环,接着打印i的值。

第二种:若是一个合数,例如14能被2整除,直接进行if条件判断的break环节,之后跳出for循环,接着打印i的值

知道了这两种方式,我们就应该想办法排除第二种打印i值的情况。

 #include//过程二
int main()
{
    int i=13;
    int j=0;
    for(j=2;j

只判断一数字是否是素数,这显然不够,接下来创建循环产生1~100以内的数

#include//过程三

int main()

{

    int i=0;

    int j=0;

    for(i=1;i<=100;i++)

    {

        for(j=2;j

优化代码

当一个数是素数时,例如17,如果按照如上算法,则需要试验2~16内的所有数,且素数越大,计算次数越多,难道2~8之内不行吗?这直接减少一半运算量

#include//过程四

#include//sqrt开平方的库函数

int main()

{

    int i=0;

    int j=0;

    int count=0;

    for(i=1;i<=100;i++)

    {

        for(j=2;j<=sqrt(i);j++)

        {

            if(i%j==0) 

               break;//跳出第二个for循环                   

         }

        if(j>sqrt(i)&&i!=1)

        {

           count++; //两条及以上的语句需要加括号

           printf("%d ",i);

         }    

     }

   printf("\ncount=%d",count);

   return 0; 

}

实战八:判断1~100内有几个9(99按两个9计数)

#include 
int main()
{
    int i=0;
    int count=0;
    for(i=1;i<=100;i++)
    {
       if(i%10==9)//个位为9
       {
          count++;
          printf("%d ",i);
       }
       if(i/10==9)//十位为9
       {
          count++;
          printf("%d  ",i);
       }
     }
     printf("\ncount=%d",count);
     return 0; 
}

实战九:分数求和

计算1/1-1/2+1/3-1/4......+1/99-1/100

知识储备:

c语言中+=是代表两个变量相加,并将答案记录在左边的变量里。

比如x+=y实际代表的表达式为:x=x+y。

#include

int main()

{

    int i=0;

    int sum=0;

    for(i=1;i<=100;i++)

    {

        sum+=1/i;

    }

     printf("%d",sum);

   return 0;

}

            我们现在运行程序,发现结果为1。这就是计算机和我们理解的偏差,例如1/1=1  但之后的1/2=0……,原因在于“/”是取商符号,要想得到小数,必须等号两段有一端是浮点数

#include
int main()
{
    int i=0;
    double sum=0;
    int N=1;//为相反数做准备
    for(i=1;i<=100;i++)
    {
        sum+=N*1.0/i;//i已经是整形
        N=-N;
    }
     printf("%lf",sum);
   return 0;
}

实战十:9*9乘法口诀表

知识储备:

%2d以两位数的形式输出,若为一位数则向右对齐。

 %-2d以两位数的形式输出,若为一位数,则向左对齐。

#include
int main()
{
    int i=0;
    int j=0;
    for(i=1;i<=9;i++)   //行
    {
        for(j=1;j<=i;j++)//列
        {
          printf("%d*%d=%-2d ",i,j,i*j);  
        }
        printf("\n");  
    }
    return 0;
}

效果如图

条件语句与循环语句实战_第1张图片

谢谢光顾

你可能感兴趣的:(c语言)