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

原文地址:https://www.cnblogs.com/MrFlySand/p/13892430.html