• C语言考点例题解析


    • 更多练习关注公众号回复"C语言练习题"及可获得链接

    求两个非负整数的最大公约数和最小公倍数。

    #include <stdio.h>
    main(){
      int m,n,r,p,gcd,lcm;
      scanf("%d%d",&m,&n);
      if(m<n){
        p=m;
        m=n;
        n=p;
      }
      p=m*n;
      r=m%n;
      /***********SPACE***********/
      while(r!=0){
        m=n;
        n=r;
        r=m%n;      
       }
       /***********SPACE***********/
       gcd=n;
       lcm=p/gcd;/*两数乘积,除以最大公约数得到最小公倍数*/
       /***********SPACE***********/
       printf("gcd=%d,lcm=%d
    ", gcd,lcm);       
    }
    
    • 辗转相除法:辗转相除法是求两个自然数(8 12)的最大公约数的一种方法,也叫欧几里德算法。
    • 伪代码如下:
    number=max%min//4=12%8
    while(number!=0){
        max=min//8
        min=number//4
        number=max%min//0=8%4
    }
    最大公约数gcd = min
    最小公倍数lcm = 输入的两个数的乘积/最大公约数
    

    计算三角形面积

    • 功能:输入三角形的三边a,b,c,判断a,b,c能否构成三角形,若能,计算面积。
    #include<stdio.h>
    /***********SPACE***********/
    #include<【math.h】>
      void main(){
      /***********SPACE***********/
      float  a,b,c,area;
      double s;
      printf("Please enter three sides of a triangle:
    ");
      scanf("%f,%f,%f",&a,&b,&c);
      /***********SPACE***********/
      s=(a+b+c)/2.0;
      /***********SPACE***********/
      area=sqrt(s*(s-a)*(s-b)*(s-c));
      /***********SPACE***********/
      if(a+b<c||b+c<a||a+c<b)
        printf("They can't form a triangle.
    ");
      else
        printf("The area of the triangle is:%f
    ",area);
    }
    

    求1!+3!+5!+……+n!的和。

    #include <stdio.h>
    main()
    {
      long int f,s;
      int i,j,n;
      /***********SPACE***********/
      s=0;//刚开始时和为0
      scanf("%d",&n); 
      /***********SPACE***********/
      for(i=1;i<=n; i+=2)//因为数值是1,3,5变化,所以步长为2.下面求阶乘用j++,因此用i+=2,不用i=i+2 
      { 
         f=1;//阶乘从1开始乘                  
         for(j=2; j<=i;j++)//求i的阶乘
         /***********SPACE***********/
           f=f*j;//格式与下面相同
         s=s+f;//将阶乘相加
      }
      printf("n=%d,s=%ld
    ",n,s);
    }
    

    求100以内个位数为6且能够被3整除的所有数

    #include<stdio.h>
    void main(){
            int i,j;
    /***********SPACE***********/
            for(i=0;i<10;i++){
              j=i*10+6;//变量*常量+常量 
              if(j%3!=0)//注意此时的continue语句,所以不能写j%3==0,而应该写j%3!=0
                continue; 
              printf("%d	",j);
            }
    }
    

    输出由字符w构造成的形如W的图形

    /*-------------------------------------------------------
    w        ww        w
     w      w  w      w
      w    w    w    w
       w  w      w  w
        ww        ww
    -------------------------------------------------------*/
    #include <stdio.h>
      /***********SPACE***********/
    void 【draw】(int n)
    { 
      int i,j,k,r,m;
      /***********SPACE***********/
      for(i=1; i<=n;i++)//输出5行
      {
        for(j=1;j<=2;j++)//输出2个vv
        {
            for(r=1;r<i;r++)//输出第一个w前的空格
              printf(" ");
            printf("w");//输出第一个w
            /***********SPACE***********/
            for(k=1;k<=2*n-2*i;k++)//输出第一个w后面的空格。空格的数量根据行数的增加而减少。因为每行的空格数量相差2个,所以要2*i;i=1时,2*i=2;但第一行空格数是8,因为10-2*i=8,但又会随着输出的行数变化所以要用k<=2*n-2*i.
                printf(" ");                                                
             printf("w");//输出第二个w
            for(m=1;m<i;m++) 
                printf(" ");//输出第二个后面的空格
        }
        /***********SPACE***********/
        printf(“
    ”);//输出第2个w及空格后换行
      }
    }
    #include <conio.h>
    main()
    {
      int n;
      printf("input a number:");
      /***********SPACE***********/
      scanf(“%d”,&n);//输入w输出的行数
      draw(n);
    }
    

    等差数列

    /*------------------------------------------------------
    题目:某等差数列的第一项a=2,公差d=3。
    下面程序的功能是将前n(1≤n≤10)项和S,输出所有项的S和能被4整除者。请填空。
    -------------------------------------------------------*/
    #include <stdio.h>
    void main()
    {
      int a,d,sum,n,i;
    /***********SPACE***********/
      a=2; d=3;i=1;sum=0;
      scanf("%d",&n);
      do{
         sum+=a;
         i++;
    /***********SPACE***********/
         a+=d;//每个元素的公差为d 
    /***********SPACE***********/
          if(s%4==0)//输出前i项的和能被4整除的数
            printf("%d
    ",sum);
      }while(i<=n);
    }
    

    说明:fun函数的功能是计算s=1+1/2!+1/3!+……+1/n!,请填写程序所缺内容。

    #include "stdio.h"
    double fun(int n)
    { 
        double s=0.0,fac=1.0;
        int i;
        for(i=1; i<=n; i++)
    
       { 
        /***********SPACE***********/
          fac=fac * 1.0/i;//求单个项,注意要用1.0/i,不能用1/i(只能取整)
        /***********SPACE***********/
          s=s+fac;//把每个单独的项相加
       }
      return s;
    }
    
    void main()
    {
         double fun(int n);
         double s;
         int t;
         scanf("%d",&t);
         s=fun(t);
         printf("s=%f
    ",s);
    } 
    

    水仙花数

    • 说明:下面程序的功能是打印出所有的“水仙花数”,请填写程序所缺内容。
    • 注:水仙花数是指一个三位数的各位数字的立方和是这个数本身。
    #include"stdio.h"
    void  f( int n)
    { 
      int i,j,k;
      i=n/100;//取出百位
      /***********SPACE***********/
      j=n/10%10;//取出十位
      k=n%10;//取出个位
      /***********SPACE***********/
      if(i*i*i + j*j*j + k*k*k == n){//各个数的立方和=这个数   
        printf("%5d
    ",n);
      }
    }
    
    void main()
    {
      void f(int n);
      int i;
      for(i=100;i<1000;i++)
        f(i);
    }
    

    题目:下列程序从键盘输入所需数据,求出z的值并输出,要求输出结果保留2位小数。

    #include <stdio.h>
    /***********SPACE***********/
    #include"math.h"      
    main(){
      int x;
      double y,z;
    /***********SPACE***********/
      scanf("【%d%f】",&x,&y);//double用%f输出。注意:不要写成%d %f
      z=2*x*sqrt(y);
    /***********SPACE***********/
      printf("z=【%.2f】",z);//double用%.2f输出2位小数。注意:不要写成%0.2f
    }
    

    放鞭炮

    • 题目:甲乙丙丁4人同时开始放鞭炮,甲每隔t1 s放一次,乙每隔t2 s放一次,丙每隔t3 s放一次,丁每隔t4 s放一次,每人各放n次。函数fun的功能是根据形参炸响,只算一次响声,第一次响声是在第0s。
    • 例如:若t1=7,t2=5,t3=6,t4=4,n=10,则总共可听到28次鞭炮声。
    #include <stdio.h>
    /***********SPACE***********/
    #define OK(s, t, n) ((s%t==0) && (s/t<n))//如果s能被次数t整除 && (时间/次数)<10次
    int fun(int  t1, int  t2, int  t3, int  t4, int  n){  
      int  count, s , maxt=t1;
      if (maxt < t2) maxt = t2;
      if (maxt < t3) maxt = t3;
      if (maxt < t4) maxt = t4;
      count=1;/* 给count赋初值 */
    /***********SPACE***********/
      for(s=1; s< maxt*(n-1); s++){//s变化的时间
        if(OK(s, t1, n) || OK(s, t2, n)|| OK(s, t3, n) || OK(s, t4, n))
          count++;
      }
    /***********SPACE***********/
      return count;//返回听到的次数
    }
    main(){ 
      int  t1=7, t2=5, t3=6, t4=4, n=10, r;
      r = fun(t1, t2, t3, t4, n);//每个人最多鞭炮的次数为n
      printf("The sound:%d
    ", r);
    }
    

    乒乓球抽签比赛

    • 功能:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
    #include <stdio.h>
    main()
    {
      char i,j,k;
      for(i='x';i<='z';i++)
        for(j='x';j<='z';j++)
        {
          /***********SPACE***********/
          if(i!=j)//i和j不是同一个人
            /***********SPACE***********/
            for(k='x';k<='z';k++)
            {
              /***********SPACE***********/
              if(i!=k && j!=k)//i和j都不是第三个人k
              {
                /***********SPACE***********/
                if(i!='x' && k!='x' && k!='z')//a(i)说他不和x比,c(k)说他不和x,z比
                   printf("order is a--%c	b--%c	c--%c
    ",i,j,k);
              }
            }
        }
    }
    

    打印菱形

    /*-------------------------------------------------------
       *
      ***
     *****
    *******
     *****
      ***
       *
    -------------------------------------------------------*/
    #include <stdio.h>
    main()
    {
      int i,j,k;
      /***********SPACE***********/
      for(i=0;i<4;i++){//输出上面四行的正三角形
        for(j=0;j<=4-i;j++)//输出星号前面换空格,空格数的变化为3,2,1,0
          printf(" ");
        /***********SPACE***********/
        for(k=1;k<=2*i+1;k++)//输出星号,星号数的变化为1,3,5,7。星号的个数=2*行数+1,行数开始为0
          printf("*");
        printf("
    ");
      }
      /***********SPACE***********/
      for(j=0;j<3;j++){//输出下面三行的倒三角形
        for(k=0;k<j+3;k++)
          printf(" ");  
        for(k=0;k<5-2*j;k++)
          printf("*");
         printf("
    ");
      }
    }
    

    年月日

    • 输入某年某月某日,判断这一天是这一年的第几天?
    #include <stdio.h>
    main()
    {
      int day,month,year,sum,leap;
      printf("
    please input year,month,day
    ");
      scanf("%d,%d,%d",&year,&month,&day);
      switch(month)
      {
        case 1:sum=0;break;//1月31天
        case 2:sum=31;break;//2月28天,共59天
        case 3:sum=59;break;//3月31天,共90天
        /***********SPACE***********/
        case 4:sum=90;break;//注意是sum=90,而不是90
        case 5:sum=120;break;
        case 6:sum=151;break;
        case 7:sum=181;break;
        case 8:sum=212;break;
        case 9:sum=243;break;
        case 10:sum=273;break;
        case 11:sum=304;break;
        case 12:sum=334;break;
        default:printf("data error");break;
      }
      /***********SPACE***********/
     sum=sum+day;//月份所得的天数+天数
      /***********SPACE***********/
      if(year%4==0 && year%100!=0 || year%400==0)//如果是闰年leap=1
        leap=1;
      else
        leap=0;
      /***********SPACE***********/
      if(leap==1 && month>2)//如果是2月12日不用加闰年29天,只能过了2月才能有闰年的问题
        sum++;
      printf("it is the %dth day.",sum);
    }
    

    功能:输入三个整数x,y,z,请把这三个数由小到大输出。

    #include <stdio.h>
    main()
    {
      int x,y,z,t;
      scanf("%d%d%d",&x,&y,&z);
      /***********SPACE***********/
      if (x>y){
        t=x;//先把x给另一个存储器t
        x=y;//x表示最小的值
        y=t;
      }
      /***********SPACE***********/
      if(x>z){
        t=x;
        x=z;
        z=t;
      }
      /***********SPACE***********/
      if(y>z){
        t=y;
        y=z;
        z=t;//z表示最大的值
      }
      printf("small to big: %d %d %d
    ",x,y,z);
    }
    

    功能:从键盘上输入两个复数的实部与虚部,求出并输出它们的和、差、积、商。

    #include<stdio.h>
    void main()
    {
      float a,b,c,d,e,f;
      printf("输入第一个复数的实部与虚部:");
      scanf("%f, %f",&a,&b);
      printf("输入第二个复数的实部与虚部:");
      scanf("%f, %f",&c,&d);
      /***********SPACE***********/
      e=a+c;
      f=b+d;
      printf("相加后复数:实部:%f,虚部:%f
    ",e,f);
      e=a*c - b*d;
      /***********SPACE***********/
      f= a*d + b*c;
      printf("相乘后复数:实部:%f,虚部:%f
    ",e,f);
      e=(a*c+b*d) / (c*c+d*d);
      /***********SPACE***********/
      f=(b*c-a*d) / (c*c+d*d);
      printf("相除后复数:实部:%f,虚部:%f
    ",e,f);
    }
    

    i2=-1
    a+bi c+di
    a+bi+c+di=a+c+bi+di=a+c+(b+d)i

    a-bi c-di
    a+bi+c+di=a+c+bi+di=a+c+(b+d)i

    (a+bi)*(c+di)
    =ac+adi+bci-bd
    =ac-bd+(ad+bc)i

    (x+y) * (x-y)=x2-y2
    (a+bi)/(c+di)
    =((a+bi) * (c-di)) / ((c+di) * (c-di))分式上下都乘(c-di)
    =((a+bi) * (c-di)) / (c2+d2)
    =(ac-adi+bci+bd) / (c2+d2)
    =(ac+bd) / (c2+d2) + (bc-ad)i / (c2+d2)

    功能:输入两个整数,求他们的按位与。

    #include<stdio.h>
    void main()
    {
      int x,y,z=0,a,b,k=1;
      scanf("%d,%d",&x,&y);
      while(x>0&&y>0)
      {
        a=x%2;
        /***********SPACE***********/
        x=x/2;//使x的值变小
        b=y%2;
        y=y/2;//使y的值变小
        /***********SPACE***********/
        z=a*b*k + z;
        k=k*2;//按位权展开求和
      }
      /***********SPACE***********/
      printf("z=%d
    ",z);//z表示与运算后的结果
    }
    

    计算长方体的体积及三个面的面积。

    #include  <stdio.h>
    int s1,s2,s3;
    int vs(int a,int b,int c){
      int v;
      /***********SPACE***********/
      v=a*b*c;//长方体的体积=长*宽*高
      s1=a*b;//求单个长方体的面积
      /***********SPACE***********/  
      s2=b*c;
      s3=a*c;
      return  v;
    }
    main(){
      int v,l,w,h;
      printf("
    input length,width and height: ");
      /***********SPACE***********/
      scanf("%d%d%d",&l,&w,&h);
      /***********SPACE***********/
      v=vs(l,w,h);
      printf("v=%d    s1=%d    s2=%d    s3=%d
    ",v,s1,s2,s3);
    }
    

    百马百担问题

    • 有100匹马,驮100担货,大马驮(hb)3担,中马(hm)驮2担,两匹小马(hl)驮1担,求大、中、小马各多少匹?
    #include <stdio.h>
    main()
    {
      int hb,hm,hl,n=0;//hb匹数
      /***********SPACE***********/
      for(hb=0;hb<=100;hb+=3)
        /***********SPACE***********/
        for(hm=0;hm<=100-hb;hm+=2)
        {
          /***********SPACE***********/
          hl=100-hb-hm;//小马驮的数量=100-大马驮的数量-中马驮的数量
          /***********SPACE***********/
          if(hb/3 + hm/2 + 2*h1==100)
          {
            n++;
            printf("hb=%d,hm=%d,hl=%d
    ",hb/3,hm/2,2*hl);
          }
        }
      printf("n=%d
    ",n);
    }
    

    百鸡问题

    • 100元买100只鸡,公鸡一只5元钱,母鸡一只3元钱,小鸡一元钱三只,求100元钱能买公鸡、母鸡、小鸡各多少只?
    #include <stdio.h>
    main()
    {
      int cocks,hens,chicks;//鸡数
      cocks=0;
      while(cocks<=19)
      {
      /***********SPACE***********/
       hens=0;//当cocks=0时计算需要多少只hens
        /***********SPACE***********/
        while(hens<=33)//100/3
        {
          chicks=100-cocks-hens;
          if(5*cocks + 3*hens + chicks/3==100)
             printf("%d,%d,%d
    ",cocks,hens,chicks);
          /***********SPACE***********/
         hens++;//要跳出循环所以hens++
        }
        /***********SPACE***********/
        cocks++;
      } 
    }
    

    功能:输入一个学生的生日(年:y0、月:m0、日:d0),并输入当前日期(年:y1、月:m1、日:d1)。求出该学生的年龄(实足年龄)。

    #include <stdio.h>
    main(){
      int age,y0,y1,m0,m1,d0,d1;
      printf("输入生日日期(年,月,日)");
    /***********SPACE***********/
      scanf("%d,%d,%d",&y0,&m0,&d0);
      printf("输入当前日期(年,月,日)");
      scanf("%d,%d,%d",&y1,&m1,&d1);
      age=y1-y0;
    /***********SPACE***********/
      if(m0>m1)age--;
    /***********SPACE***********/
      if((m0==m1) && (d0>d1))
        age--;
      printf("age=%3d",age);
    }
    
    • 2000.10.20和2020.12.20有19岁
    • 2000.12.20和2000.12.20有19岁
    • 2020.12.20和2020.10.10有20岁
    • 2020.12.20和2020.12.10有20岁

    计算一元二次方程的根

    #include <stdio.h>
    /***********SPACE***********/
    #include <math.h>
    main()
    {
      double x1,x2,imagpart;
      float a,b,c,disc,realpart;
      scanf("%f%f%f",&a,&b,&c);
      printf("the equation");
      /***********SPACE***********/
      if(fabs(a) <= 1e-6)
        printf("is not quadratic
    ");//不是二次函数
      else
        disc=b*b-4*a*c;
      
      if(fabs(disc) <= 1e-6)//有两个相同的根
        printf("has two equal roots:%-8.4f
    ",-b/(2*a));
      /***********SPACE***********/
      else if(fabs(disc) > 0){//有两个不同的根
        x1=(-b+sqrt(disc))/(2*a);
        x2=(-b-sqrt(disc))/(2*a);
        printf("has distinct real roots:%8.4f and %.4f
    ",x1,x2);
      }else{//有两个虚根
        realpart=-b/(2*a);
        imagpart=sqrt(-disc)/(2*a);
        printf("has complex roots:
    ");
        printf("%8.4f=%.4fi
    ",realpart,imagpart);
        printf("%8.4f-%.4fi
    ",realpart,imagpart);
      }
    }
    

    解一元二次方程

    • disc=b2-4ac.
    • disc>0有两个不同的根
    • disc=0有两个相同的根
    • disc<0没有根
    #include"stdio.h"
    #include"math.h"
    main(){
      float a,b,c;
      float disc, x, y;
      scanf("%f%f%f",&a,&b,&c);
      disc = b*b-4*a*c;
      if(disc > 0){
        x = (-b+sqrt(disc)) / (2*a);
        y = (-b-sqrt(disc)) / (2*a);    
      }else if(disc == 0){
        y = x = (-b+sqrt(disc)) / (2*a);
      }else{
        printf("error");
      }
      printf("%f %f",x,y);
    }
    

    圆周率PI

    • 功能:用下面的公式求pi的近似值。直到最后一项的绝对值小于
      指定的数(参数num)为止。
    • pi/4=1-1/3+1/5-1/7+......
    • 例如:程序支行后,输入0.0001,则程序输出3.1414
    #include<stdio.h>
      /***********SPACE***********/
    float fun(【num】){
      int n=1,sign=1;
      float sum=0.0,t=1.0;
        /***********SPACE***********/
      while(t【>=】num){//注意符号
        sum+=sign*t;
        /***********SPACE***********/
        sign=【-sign】;
        n+=2;
        /***********SPACE***********/
        【t=1.0/n】;//注意:要用1.0/n,不能用1/n
      }
        /***********SPACE***********/
      return 【4*sum】;
    }
    main(){
      float num=0.0001;
      printf("pi=%.4f
    ",fun(num));
    }
    
    #include <stdio.h>
    #include <math.h>
    main(){
      int s,n;
      /***********SPACE***********/
      double pi,t;
      t=1;pi=0;n=1;s=1;
      /***********SPACE***********/
      while(fabs(t)>=2e-6)//注意是fabs(t)不是t
      {
        pi+=t;
        n+=2;
        s=-s;
        t=s/n;
      }
      /***********SPACE***********/
      pi*=4;
      printf("pi=%.6f
    ",pi);
    }
    

    人口普查

    • 功能:1982年我国第三次人口普查,结果全国人口为10.3亿,假如人口增长率为5%。编写一个程序求在公元多少年总人口翻了一番。
    #include<stdio.h>
    void main(){
      double p1=10.3,p2,r=0.05;
      int n=1;
      /***********SPACE***********/
      p2=p1*(1+r);//注意:不能直接+r
      /***********SPACE***********/
      while(p2<=2*p1)//翻了一番表示是原来的2倍
      {
        n++;
        /***********SPACE***********/
        p2=p2*(1+r);  
      }
      /***********SPACE***********/
      n=1982+p2;//p2是经过的年数,问的是在哪一年达到要求,所以要+1982 
      printf("%d年人口总数翻了一番,即为%g亿人
    ",n,p2);
    }
    

    企业奖金

    • 功能:企业发放的奖金根据利润提成。利润(i)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数?
    #include <stdio.h>
    main()
    {
      long int i;
      double bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
      scanf("%ld",&i);
      bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
      bonus4=bonus2+200000*0.5;
      bonus6=bonus4+200000*0.3;
      bonus10=bonus6+400000*0.15;
      if(i<=100000)
        bonus=i*0.1;
      /***********SPACE***********/
      else if(i<=200000)//注意:不能填i>100000 $$ i<=200000,因为在前面小于100000的已经判断过了 
        bonus=bonus1+(i-100000)*0.075;
      /***********SPACE***********/
      else if(i<=400000)                                
        bonus=bonus2+(i-200000)*0.05;
      /***********SPACE***********/
      else if(i<=600000)                                
        bonus=bonus4+(i-400000)*0.03;
      else if(i<=1000000)
        bonus=bonus6+(i-600000)*0.015;
      else
        bonus=bonus10+(i-1000000)*0.01;
      /***********SPACE***********/
      printf("%s
    ", );("bonus=%d",bonus);
    }
    

    功能:已知X、Y、Z分别表示0~9中不同的数字,编程求出使算式

      XXXX+YYYY+ZZZZ=YXXXZ成立时X、Y、Z的值,并要求打印该
      算式。
    
    #include  <stdio.h>
    #include <stdlib.h>
    main()
    {
      int x,y,z;
      /***********SPACE***********/
      for(x=0;x<10;x++)
        for(y=0;y<10;y++)
        {
          if(y==x)//x和y不能相等
           continue;
          for(z=0;z<10;z++)
          {
          /***********SPACE***********/
          if(z==x || z==y) //z和x不能相等,z和y不能相等
            continue;
          /***********SPACE***********/
          if(1111*(x+y+z)== 10000*y + 1110*x + z)
          {
            printf("x=%d,y=%d,z=%d
    ",x,y,z);
            /***********SPACE***********/
            printf("%d+%d+%d=%d
    ",1111*x,1111*y,1111*z,10000*y + 1110*x + z);
            exit(0);
          }
        }
      }
    }
    

    ?2 * 7?=3848 输出问号的值

    功能:算式:?2 * 7?=3848中缺少一个十位数和一个个位数。编程求出使该算式成立时的这两个数,并输出正确的算式。

    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
      int x,y;
      /***********SPACE***********/
      for(x=1;x<10;x++)//十位上的数是1~9
        /***********SPACE***********/
        for(y=0;y<10;y++)//个位上的数是0~9
          /***********SPACE***********/
          if((10*x+2) * (70+y)==3848){//注意:+2
            /***********SPACE***********/
            printf("%d*%d=3848
    ",x,y);
            exit(0);
          }
    
    }
    

    功能:一个40磅重的板碎成4块,每块正好是一个整数磅,且用这4块当砝码能称出1~40磅的整数重量的物体。编程求这4块的各自重量。

    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
      int i,j,k,l,p,t1,t2,t3,t4;
      for(i=1;i<38;i++)
        /***********SPACE***********/
        for(【j=i】;j<38-i;j++)
          /***********SPACE***********/
          for(k=j;k<【38-i-j;k++)
          {
            l=40-i-j-k;
            for(p=1;p<40;p++)
            {
              for(t1=-1;t1<2;t1++)
                for(t2=-1;t2<2;t2++)
                  for(t3=-1;t3<2;t3++)
                    for(t4=-1;t4<2;t4++)
                      /***********SPACE***********/
                      if(【】==p) goto next;
              break;
              /***********SPACE***********/
              next:if(p==【39】){
                printf("%d,%d,%d,%d
    ",i,j,k,l);
                exit(0);
             }
          }
      }
      printf("error.");
    }
    
    • 有一个天平,左边可以放物品和砝码,右边只能放砝码
    • 当左边放砝码时为-1,当右边放砝码时+1

    功能:编程求任意给两个日期(Y0年M0月DO日和Y1年M1月D1日)相差的天数。

    #include  <stdio.h>
    #include <stdlib.h>
    int f(int y){
      return(y%4==0&&y%100!=0||y%400==0); /*闰年1,平年0*/
    }
    int mday(int y,int m){
      return(31-((m==4)+(m==6)+(m==9)+(m==11))-(3-f(y))*(m==2));/*这个月有几天*/
    }
    
    int yday(int y,int m,int d) {/*这一年过了多少天*/
      return(d+31*((m>1)+(m>3)+(m>5)+(m>7)+(m>8)+(m>10))+30*((m>4)+(m>6)+(m>9)+(m>11))+(28+f(y))*(m>2));
    }         
    int yend(int y,int m,int d){/*这一年剩下多少天*/
      return(365+f(y)-yday(y,m,d));
    }           
    main(){
      int y1,m1,d1;//过去的日期
      int y2,m2,d2;//现在的日期
      int n,i;
      printf("y1,m1,d1=");
      scanf("%d,%d,%d",&y1,&m1,&d1);//输入第一个的日期
      /***********SPACE***********/
      if(m1<1 || m1>12 || d1<1 || d1>mday(y1,m1)) //不在规定日期范围内
        exit(0);
      printf("y2,m2,d2=");
      scanf("%d,%d,%d",&y2,&m2,&d2);//输入第二个的日期
      /***********SPACE***********/
      if(m1<1 || m1>12 || d1<1 || d1>mday(y2,m2)) //不在规定日期范围内
        exit(0);
      if(y1>y2 || y1==y2 && m1>m2 || y1==y2 && m1==m2 && d1>d2){
      //y1如果大于y2,则用y1表示过去的时间
        n=y1;y1=y2;y2=n;
        n=m1;m1=m2;m2=n;
        n=d1;d1=d2;d2=n;
      }else{
        /***********SPACE***********/
        n=yend(y1,m1,d1)/*计算以前剩下的天数*/ + yday(y2,m2,d2);/*计算现在过了多少天*/
        /***********SPACE***********/
        for(i=y1+1;i<y2;i++)//计算相差多少年 
          n+=365+f(i);
      }
      printf("%d.%d.%d--->%d.%d.%d:n=%d
    ",y1,m1,d1,y2,m2,d2,n);//n是相差的天数
    }
    

    功能:三角形的面积为:area=sqrt(s*(s-a)*(s-b)*(s-c)).其中,s=(a+b+c)/2,a、b、c为三角形三条边的长。定义两个带参数的宏,一个用来求s,另一个用来求area。编写程序,在程序中用带参数的宏求面积area。

    #include <stdio.h>
    #include "math.h"
    /***********SPACE***********/
    #define S(x,y,z) (x+y+z)/2
    #define AREA(s,x,y,z) sqrt(s*(s-x)*(s-y)*(s-z))
    
    main()
    {
      double area;
      float a,b,c,s;
      printf("a,b,c=");
      /***********SPACE***********/
      scanf("%f,%f,%f",&a,&b,&c);
      if(a+b>c && b+c>a && c+a>b)
      {
        /***********SPACE***********/
        s=S(a,b,c);//注意:调用自定义函数
        /***********SPACE***********/
        area=AREA(s,a,b,c);
        printf("area=%f
    ",area);
      }
    }
    

    二分法求方程的根

    • 功能:用二分法求方程2X3+4X2+3X-6=0在(-10,10)之间的根,其中 X^n代表X的n次方。
    #include <stdio.h>
    # include <math.h>
    main()
    {
      float x0,x1,x2,fx0,fx1,fx2;
      do{
        printf("Enter x1&x2:");
        scanf("%f,%f",&x1,&x2);
        fx1=x1*((2*x1-4)*x1+3)-6;
        fx2=x2*((2*x2-4)*x2+3)-6;
      /***********SPACE***********/ 
      }while(fx1*fx2 > 0);                                
      do{
        x0=(x1+x2)/2;
        fx0=x0*((2*x0-4)*x0+3)-6;
        /***********SPACE***********/
        if(fx0*fx1 < 0){
          x2=x0;
          fx2=fx0;
        }else{
          x1=x0;
          fx1=fx0;
        }
      }while(fabs(fx0) >= 1e-5);                                
      printf("x=%6.2f
    ",x0);
    }
    

    功能:不用第三个变量,实现两个数(5,8)的对调操作。

    #include <stdio.h>
    main()
    { 
      int a,b;
      scanf("%d %d",&a,&b);
      printf("a=%d,b=%d
    ",a,b);
      /***********SPACE***********/
      a= a+b ;//13=5+8                        
      /***********SPACE***********/
      b= a-b ;//5=13-8                      
      /***********SPACE***********/
      a= a-b ;//8=13-8                       
      printf("a=%d,b=%d
    ",a,b);
    }
    

    功能:编写程序,输出 1000 以内的所有完数及其因子。

    • 说明:所谓完数是指一个整数的值等于它的因子之和。
    • 例如“ 6 的因子是 1 、 2 、 3 ,而 6=1+2+3 ,故 6 是一个完数。
    #include <stdio.h> 
    main() 
    {
      int i,j,m,s,k,a[100] ;
      for(i=1 ; i<=1000 ; i++ )
      {
        m=i ; s=0 ; k=0 ;
        for(j=1 ; j<m ; j++)
          /***********SPACE***********/
          if(m%j==0){//j是m(完数)的因子
            s=s+j ;//完数m的和
            /***********SPACE***********/
            a[k++]=j ;//将因子放入数组中
          } 
        if(s!=0 && s==m)
        {
          /***********SPACE***********/
          for(j=0 ;j<k ;j++)//k代表最大的数组下标                
            printf("%4d",a[j]);
          printf(" =%4d
    ",i);//因子之和
        } 
      }
    }
    

    亲密数

    • 功能:如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子 ( 包括1,不包括B本身 ) 之和等于A,则将整数A和B称为亲密数。求 3000 以内的全部亲密数。
    #include <stdio.h>
    #include <stdio.h> 
    main() {
      int a, i, b, n ;
      printf("Friendly-numbers pair samller than 3000:
    ") ;
      for(a=1 ; a<3000 ; a++)
      {
        for(b=0,i=1 ; i<=a/2 ; i++ )
        /***********SPACE***********/
        if(!(a%i)){//将a的所有因子相加给b
          b=b+i;
        }                
        for(n=0,i=1 ; i<=b/2 ; i++)
          /***********SPACE***********/
          if(!(b%i)){//将b的所有因子相加给n
            n=n+i ;
          }                
        /***********SPACE***********/
        if(b==n && a<b)//                        
          printf("%4d~%4d
    ",a,b) ;
      }
    }
    

    功能:一个自然数被 8 除余 1 ,所得的商被 8 除也余 1 ,再将第二次的商被8 除后余7 ,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。编写程序求这个自然数。

    #include <stdio.h>
    main( ) {
      int i,n,a ;
      i=0 ;
      while(1){
        if(i%8==1) {//被 8 除余 1 
          n=i/8 ;
          if(n%8==1){//被 8 除余 1 
            n=n/8 ;
            /***********SPACE***********/
            if(n%8==7) //被8 除后余7 
              a=a/8 ;                        
          } 
        } 
        if(i%17==4) {//被17除余4
          n=i/17 ;
          if(n%17==15)//被17除余15
           n=n/17 ;
        } 
        if(2*a==n) { 
          printf("result=%d
    ",i) ;
          /***********SPACE***********/
          break ;//输出后跳出循环                                        
        } 
        /***********SPACE***********/
        i++;//使i的值递增                                                
      } 
    }
    

    功能:识别输入的字符串,每个单词输出一行

    #include <stdio.h>
    #include <string.h>
    void main()
    {
      int c;
      int inspace;
      /***********SPACE***********/
      inspace=0;                                        
      while((c = getchar()) != '
    '){
        if(c == ' ' || c == '	' || c == '
    '){
          /***********SPACE***********/
          if(inspace==0){
            inspace = 1;
            putchar('
    ');
          }
        }else{
          inspace = 0;
          /***********SPACE***********/
          putchar(c);                                        
        }
      }
    }
    

    题目:下面程序的功能是用递归法求n!。

    #include <stdio.h>
    void  main()
    {
      /***********SPACE***********/
      long fac();   
      int n;
      long y;
      printf("input an integer number:");
      scanf("%d",&n);
      /***********SPACE***********/
      y=fac(n);
      printf("%d!=%ld
    ",n,y);
    }
    
    long fac(int n)
    {
      long f;
      if(n<0)
         printf("n<0,data error!");
      else if(n==0,n==1) 
        f=1;
      else  
        /***********SPACE***********/
        f=fac(n-1)*n;//注意:是fac(n-1),不是fac(n--)
      return(f);
    }
    

    功能:下面程序是计算 sum=1+(1+1/2)+(1+1/2+1/3)+...(1+1/2+...1/n)的值

    • 例如:当n=3,sum=4.3333333
    -------------------------------------------------------*/
    #include <stdio.h>
    double f(int n)
    {
      int i;
      double s;
      s=0;
      for(i=1;i<=n;i++) 
        /***********SPACE***********/
        s =s + 1.0/i;
      return s;
    }
    main()
    {
      int i,m=3;
      double sum=0;
      for(i=1;i<=m;i++) 
        /***********SPACE***********/
        sum=sum + f(i);
      /***********SPACE***********/  
      printf("%f
    ",sum);//注意:要用%f,不能用%lf
    }
    

    变号操作

    • 功能:调用函数fun计算m=1-2+3-4+……+9-10,并输出结果。
    #include <stdio.h>
    int fun( int n)
    {
      int m=0,f=1,i;
      /***********SPACE***********/
      for(i=1;i<=n;i++)
      {
        m+=i*f;
        /***********SPACE***********/
        f=-f;//变号操作
      }
      /***********SPACE***********/
      return m;
    }
    
    main()
    {
      printf("m=%d
    ", fun(10));
    }
    

    统计数字字符的个数

    • 给定程序中,程序的功能是:从键盘输入的字符中统计数字字符的个数,用换行符结束循环。请填空。
    • 例如:输入:CADX2012JSJ0623
    • 输出:8
    #include<stdio.h>
    
    void  main()
    {
      int n=0,c;
      c=getchar();
    /***********SPACE***********/
      while(c!='
    ') 
      {
    /***********SPACE***********/
        if(c>='0' && c<='9')
        n++;  
        c=getchar();
      }
      printf("%d",n);
    }
    

    解一元二次方程

    • 请补充main函数,该函数的功能是求方程ax*x+bx+c=0的两个实数根。方程的系数a、b、c从键盘输入,如果判别式(disc=b*b-4ac)小于0,则要求重新输入a、b、c的值。
    • 例如:当a=1,b=2,c=1时,方程的两个根分别是x1=-1.00,
      x2=-1.00。
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    void main(){
        float a,b,c, disc,x1,x2;
        do{
            printf("Input a,b,c:");
            scanf("%f,%f,%f",&a,&b,&c);
            disc=b*b-4*a*c;
            if(disc<0)
                printf("disc=%f
     Input again!
    ",disc);
        }while(disc>=0);
        printf("*******the result*******
    ");
      /***********SPACE***********/
        x1=(-b+sqrt(disc)/(2*a);//注意:填写sqrt(disc)
      /***********SPACE***********/
        x2=(-b-sqrt(b*b*-4*a*c))/(2*a);
        printf("
    x1=%6.2f
    x2=%6.2f
    ",x1,x2);
    }
    

    斐波那契数列

    • 斐波那契数列的前几项是:1,1,2,3,5,8,13,21...。编程输出该数列,直到某项的值大于1000为止,每行输出10个。请将源程序
    #include <stdio.h>
    main(){
      int a=1,b=1,c,i;
      printf(%-6d%-6d",a,b);
      for(i=3;;i++){
        c=a+b;   
       /***********SPACE***********/
         if(c>1000)  break;
       /***********SPACE***********/
         a=b;
       /***********SPACE***********/
         b=c;
       /***********SPACE***********/
         printf("%d",c);
         if(i%10==0)
       /***********SPACE***********/
         printf("
    ");
       }
    }
    

    功能:求满足1+2+3+...n<500中最大的N,并求其和。

    #include <stdio.h>
    void main()
    {
      /***********SPACE***********/
      int n=0;sum;
      /***********SPACE***********/
      while(sum<500】)
      {
          /***********SPACE***********/
         n++;//n++要放在sum+=n前面
          /***********SPACE***********/
         sum+=n;
      }
      /***********SPACE***********/
      printf("n=:%d
    ",【n】);
      printf("1+2+3+...+%d<500
    ",sum);
    }
    

    四则运算

    • 功能:编写程序,输入两个整数,和+、-、*、/之中的任意一个运算符,输出计算结果。
    #include<stdio.h>
    void main(){
    /***********SPACE***********/
      【int】 a,b;
      char c;
      printf("请输入一个运算符:
    ");
      /***********SPACE***********/
      scanf("【%c】",&c);
      printf("请输入两个整数:
    ");
      /***********SPACE***********/
      scanf("%d,%d",【&a,&b】)
      /***********SPACE***********/
      【switch】(c)
      {
      case '+':printf("%f
    ",a+b);break;
      case '-':printf("%f
    ",a-b);break;
      case '*':printf("%f
    ",a*b);break;
      case '/':printf("%f
    ",a/b);break;
      /***********SPACE***********/
      【default】:printf("错误");
      }
    }
    

    解一元二次方程

    • 编程序,求方程ax*x+bx+c=0的解;输入a,b,c的值
    #include<stdio.h>
    #include<math.h>
    void main()
    {
      float a,b,c,t;
      double x1,x2;
      printf("请由高次到低次顺序输入系数:
    ");
      /***********SPACE***********/
      scanf("【%f%f%f】",&a,&b,&c);//注意:输入格式不要有空格
      /***********SPACE***********/
      t=【b*b-4*a*c】;
      /***********SPACE***********/
      if(【t<0】) 
        printf("方程无实根
    ");
      /***********SPACE***********/
      if(【t=0】){
        x1=-(b/2/a);
        printf("方程有两个相等实根,x1=x2=%5.2f
    ",x1);
      }
      /***********SPACE***********/
      if(【t>0】){
        x1=-(b+sqrt(t))/2/a;
        x2=-(b-sqrt(t))/2/a;
        printf("方程有两个不等实根,x1=%5.2f,x2=%5.2f
    ",x1,x2);
      }
    }
    

    取出各个位求和

    • 功能:从键盘输入一个整数,计算其各位数字之和。比如输入整数31421,则输出11
    #include<stdio.h>
    main(){
      int i,sum=0,a;
      /***********SPACE***********/
      scanf("%d",【&i】);//注意:用&i,不用&a
      /***********SPACE***********/
      while(【i>0】)
      /***********SPACE***********/
      a=【i%10】;
      sum=sum+a;
      /***********SPACE***********/
      i=【i/10】;
      /***********SPACE***********/
      【printf】("%d
    ",sum);
    }
    

    小球落地

    • 小球从100米高处落下,每次跳原来一半高,请问第10次落地时经过的距离,及第10次弹跳的高度。
    #include<stdio.h>
    main()
    {
    /***********SPACE***********/
       【float】 s=100.0,h=100.0;
    /***********SPACE***********/
       【int i】;
    /***********SPACE***********/
       for(i=2;i<=10;i++){
         h=h/2;
    /***********SPACE***********/
         s=s+2*h;
        }
    /***********SPACE***********/
        printf("%.2f,%.2f",【s,h/2】);//最后一次落下要/2
    }
    

    次数 落下的高度 弹起的高度(h) 总和s
    1 100 0 100
    2 50 50 200
    3 25 25 250
    4(假设是最后一次) 12.5 262.5

    红球白球黑球

    • 功能:从三个红球、五个白球、六个黑球中任意取出八个球,且
      其中必须有白球,输出所有可能的方案。请填空
    #include<stdio.h>
    main(){
    /***********SPACE***********/
      【int】  i,j,k;
      for(i=0;i<=3;i++)
      /***********SPACE***********/
       for(【j=1】;j<=5;j++)//注意:至少有一个白球
        {
      /***********SPACE***********/
          k=【8-i-j】;
      /***********SPACE***********/
          if(【k>=0 && k<=6】)//注意:黑球的个数是0-6个
      /***********SPACE***********/
          【printf】("%3d %3d %3d
    ",i,j,k);
      }
    }
    

    人民币转换

    • 题目:下面程序的功能是完成用一元人民币换成一分、两分、五分
      的所有兑换方案。请填空。
    #include<stdio.h>
      /***********SPACE***********/
    【main()】//注意:不要填math.h
    {
      /***********SPACE***********/
      int i,j,k,l=【0】;
      for(i=0;i<=20;)
        for(j=0;j<=50;j++){
          /***********SPACE***********/
          k=【100-5*i-2*j】;
          /***********SPACE***********/
          if(【k>=0】){
            printf("%2d %2d %2d ",i,j,k);
          /***********SPACE***********/
            【l++】
            if(l%5==0) 
             printf("
    ");
        }
      }
    }
    

    求累加

    • 求3+9+27+81+243+...这样的数之和,若累加数大于5000时,则结束累加。
    #include <【math.h】>
    #include <stdio.h>
          /***********SPACE***********/
    #【define】  N   3
    main(){
      int s,i;
      s=0;
      i=1;
       /***********SPACE***********/
      while( 【s<=5000】 ){
        s=s+【pow(N,i)】;//注意:不能填pow(3,i)
        i++;
      }
            /***********SPACE***********/
      【printf】("%d
    ",s);
    }
    

    求分数数列

    • 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13……。求出这个数列的前20项之和。要求:按四舍五入的方式精确到小数点后第二位。将下列程序补充完整
    #include <stdio.h>
    main(){
      int n;
      /***********SPACE***********/
      【float】 a=2.0,b=1.0,t,s=0;
      /***********SPACE***********/
      for(n=1;【n<=20】;n++)  
      /***********SPACE***********/
      {s=s+【a/b】; 
      /***********SPACE***********/
      t=a;【a=a+b】;b=t; 
      }
      /***********SPACE***********/
      printf("%【.2】
    ",s);//注意:保留2位小数
    }
    

    输出n个素数

    • 题目:以下程序输入n和n个大于1的正整数,输出其中素数。
    • 如输入:5 19 93 11 37 15 则输出:19 11 37
    • 例示说明:先输入n为5,再输入5个正整数,输出5个整数中的素数
    #include <stdio.h>
    void main()
    {
      int  n, a, i, j, ct;
      /***********SPACE***********/
      scanf( "%d",【&n】);
      /***********SPACE***********/
      for ( i=0;i【<】n; i++ ){//输出n个素数
        /***********SPACE***********/
        【ct=0】;
        scanf( "%d", &a );
        for( j=2; j<a; j++ ){//判断a是否为素数
          /***********SPACE***********/
          if (【a%j==0】)//如果j是a的因子,则ct不等于0
            ct++;
        }
        /***********SPACE***********/
        if (ct【==】0)
          printf( "%d  ", a );//a是素数
      }
      printf( "
    " );
    }
    

    分数数列的前20项和

    • 题目:一个数列是:3/5,5/7,7/9,9/11,...求这个数列前20项的和。
    #include<stdio.h>
    main(){
      int i;
        /***********SPACE***********/
      【float】 a=3.0,b=5.0,s=0.0;
        /***********SPACE***********/
      for(i=0;【i<20】;i++){
          /***********SPACE***********/
        s=【s+a/b】;
          /***********SPACE***********/
        a=【a+2】;//注意:最好不要填a=b
          /***********SPACE***********/
        b=【b+2】;
      }
      printf("s=%7.2f
    ",s);
    }
    

    字母转换

    • 题目:题目:面程序的功能是将大写字母变成小写字母后的第三个字母。其中X变成a,Y变成b,Z变成c.请填空。
    #include<stdio.h>
    main()
    {
      char  c;
      /***********SPACE***********/
      【printf】("请输入任意一字母:");
      /***********SPACE***********/
      scanf("%c",【&c】);
      /***********SPACE***********/
      while(【c!='
    '】){
        /***********SPACE***********/
        //先将大写字母转成小写字母+32,变成小写字母后的第三个字母+3,一共+35
        if(c>='A'&&c<=【'W'】)  
          c=c+35;
        else if(c>='X'&&c<='Z')//如果是Z变成小写字母z(+32),变成c(-26+3=-23),32-23=9
        /***********SPACE***********/
          【c=c+9】;
      }
      printf("%c",c);
      }
    }
    

    两个数由小到大排序输出

    • 题目:下面程序的功能是将从键盘输入的两个数由小到大排序输出。当输入两个相等数时结束循环。
    #include<stdio.h>
    main(){
    /***********SPACE***********/
      【float】 a,b;
      /***********SPACE***********/
      scanf("%f%f",【&a,&b】);
      /***********SPACE***********/
      while(【a!=b】){
        /***********SPACE***********/
        if(【a<b】){
          a=a+b;
          /***********SPACE***********/
          【a=a-b】;
          a=a-b;
        }
        printf("%d,%d
    ",a,b);
        scanf("%d%d",&a,&b);
      }
    }
    

    总结

    • 前言:文章是根据学校题库(湖北职考)和自己学习整理的知识点,如果出现错误的知识点请及时和博主MrFlySand联系或学习。
    • 希望你学习的不是知识和代码,而是编程和培养解决事情的能力。如果你只为了学而学,没有自己的独立分析和见解,只是照猫画虎,意义不大。
    • 【】内是要填写的内容,要运行时要删除【】
    • 本文章主要试用于考试的一些浅规则,实际开发有些地方不必如此。
    • double定义,用%f输出,不能用%lf,如:代码。如果代码中有对应的,则用对应的输出格式
    • 有宏定义一定要用宏定义,如:代码
    • 如果有浮点数用float,不用double,如:代码
    • 保留2位小数用%.2f,保留3位小数用%.3f
    • 运算关系式与最近定义的字母有关,如:代码
    • 注意:书写时不能写成≥,而是>=

    ❤️有则改之,无则加勉。如有错误、建议、疑问,评论或联系飞沙QQ:2602629646
    ❤️本文来自作者:MrFlySand,转载请注明原文链接:https://www.cnblogs.com/MrFlySand/p/13892430.html

  • 相关阅读:
    javascript内存泄漏
    闭包
    JavaScript 数组(Array)对象
    什么是跨域?跨域请求资源的方法有哪些?
    理解闭包
    比较typeof与instanceof
    js 字符串操作函数
    js去除字符串空格
    Thematic002.字符串专题
    Thematic001.数论专题
  • 原文地址:https://www.cnblogs.com/MrFlySand/p/13892430.html
Copyright © 2020-2023  润新知