前言

整理了很多C语言编程的练习题。总结自zqxLonely

篇幅所限,将文章分为了三篇、九部分。下面是文章链接。



练习题总览

    第一部分
        韩信点兵
        兰州烧饼
        进制转换
        第几天?
        成绩转换
    第二部分
        求实数的绝对值。
        计算球体积
        两点距离
        ASCII码排序
        数值统计
    第三部分
        最小公倍数
        公约数和公倍数
        5个数求最值
        素数筛子算法
        分数加减法
    第四部分
        第二小整数
        奇偶数分离
        奇偶位互换
        统计硬币
        汉字统计
    第五部分
        偶数求和
        杨辉三角
        统计字符
        完数
        素数回文
    第六部分
        快速排序
        开门人和关门人
        鸡兔同笼
        日期计算
        开灯问题
    第七部分
        字符串替换
        字母统计
        字符串逆序输出
        交换输出
        比较字母大小
    第八部分
        猴子吃桃问题
        九九乘法表
        16进制的简单运算
        三角形面积
        平方和与立方和
    第九部分
        水仙花数
        多项式求和
        绝对值排序
        首字母变大写
        a/b + c/d

第一部分

韩信点兵

相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100 。
  • 输入

输入3个非负整数a,b,c ,表示每种队形排尾的人数(a<3,b<5,c<7)。例如,输入:2 4 5

  • 输出

输出总人数的最小值(或报告无解,即输出No answer)。实例,输出:89

#include <stdio.h>

int main(){
    int a;
    int b;
    int c;
    int i;
    
    scanf("%d%d%d",&a,&b,&c);
    
    for(i=10;i<=100;i++){
        if(i%3==a && i%5==b && i%7==c){
            printf("%d\n",i);
            break;
        }
    }
    
    if(i==101)
        printf("No answer\n");
    
    
    return 0;
}

兰州烧饼

感谢 LittleOne 的指正
第12行代码if(total<k) 没有做等于的判断导致结果错误,已经更改
评论地址:https://bingyishow.top/Technical-article/16.html/comment-page-1#comment-402

烧饼有两面,要做好一个兰州烧饼,要两面都弄热。当然,一次只能弄一个的话,效率就太低了。有这么一个大平底锅,一次可以同时放入k个兰州烧饼,一分钟能做好一面。而现在有n个兰州烧饼,至少需要多少分钟才能全部做好呢?
  • 输入

依次输入n和k,中间以空格分隔,其中1 <= k,n <= 100000

  • 输出

输出全部做好至少需要的分钟数

  • 提示

如样例,三个兰州烧饼编号a,b,c,首先a和b,然后a和c,最后b和c,3分钟完成

#include <stdio.h>

int main(){
    int n;
    int k;
    int total;
    int result;
    
    while(scanf("%d%d",&n,&k)!=EOF){
        total=n*2;
        
        if(total<=k){  
            printf("2\n");
            continue;
        }

        result=total/k;
    
        if(total%k!=0)
            result++;
        
        printf("%d\n",result);
    }
    
    return 0;
}

错误代码(2020年4月25日22:15:04)

#include <stdio.h>

int main(){
    int n;
    int k;
    int total;
    int result;
    
    while(scanf("%d%d",&n,&k)!=EOF){
        total=n*2;
        
        if(total<k){  //没有考虑到total<k的情况 (此处有误,没有判断=的情况)
            printf("2\n");
            continue;
        }

        result=total/k;
    
        if(total%k!=0)
            result++;
        
        printf("%d\n",result);
    }
    
    return 0;
}

进制转换

输入一个十进制数N,将它转换成R进制数输出。
  • 输入

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

  • 输出

为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

#include <stdio.h>

int main(){
    int number;
    int system;
    char s[50];
    int i;
    int length;
    int flag;
    
    while((scanf("%d%d",&number,&system))!=EOF){
        i=0;
        flag=0;
        
        if(number<0){
            number=-number;
            flag=1;
        }
        
        while(number){
            if(number%system<=9){
                s[i]=(number%system)+'0';
            }
            
            else if(number%system==10)
                s[i]='A';
                
            else if(number%system==11)
                s[i]='B';
            
            else if(number%system==12)
                s[i]='C';
                
            else if(number%system==13)
                s[i]='D';
                
            else if(number%system==14)
                s[i]='E';
                
            else if(number%system==15)
                s[i]='F';
                
            number/=system;
            i++;
        }
        length=i;
        
        if(flag==1)
            printf("-");
            
        for(i=length-1;i>=0;i--)
            printf("%c",s[i]);
            
        printf("\n");
        
        
        
    }
        
    
    return 0;
}

第几天?

给定一个日期,输出这个日期是该年的第几天。
  • 输入

输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。

  • 输出

对于每组输入数据,输出一行,表示该日期是该年的第几天。

#include <stdio.h>
 
int main(){
    int a;
    int b;
    int c;
    int i;
    int day[13];
    int sum;
     
    day[1]=31;
    day[2]=28;
    day[3]=31;
    day[4]=30;
    day[5]=31;
    day[6]=30;
    day[7]=31;
    day[8]=31;
    day[9]=30;
    day[10]=31;
    day[11]=30;
    day[12]=31;
     
    while((scanf("%d/%d/%d",&a,&b,&c))!=EOF){
        sum=0;
         
        for(i=1;i<=b-1;i++)
            sum+=day[i];
             
        sum+=c;
         
        if((a%400==0 || (a%4==0 && a%100!=0)) && b>=3)
            sum++;
             
        printf("%d\n",sum);
    }
     
     
    return 0;
}

成绩转换

输入一个百分制的成绩M,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;
#include <stdio.h> 

int main(){
    int T;
    int n;
    char c;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d",&n);
        
        if(n>=90)
            c='A';
            
        else if(n>=80)
            c='B';
            
        else if(n>=70)
            c='C';
            
        else if(n>=60)
            c='D';
            
        else
            c='E';
            
        printf("%c\n",c);
    } 
    return 0;
}

第二部分

求实数的绝对值。

求实数的绝对值。
  • 输入

输入数据有多组,每组占一行,每行包含一个实数。

  • 输出

对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。

#include <stdio.h>
 
int main(){
    double number;
     
    while((scanf("%lf",&number)!=EOF)){
        if(number<0)
            number=-number;
             
        printf("%.2lf\n",number);
    }
    return 0;
}

计算球体积

根据输入的半径值,计算球的体积。
  • 输入

输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。

  • 输出

输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。

#include <stdio.h>
#define PI 3.1415927
 
int main(){
    double r;
    double result;
     
    while((scanf("%lf",&r))!=EOF){
        result=4.0*PI*r*r*r/3.0;
         
        printf("%.3lf\n",result);
    }
     
    return 0;
}

两点距离

输入两点坐标(X1,Y1),(X2,Y2)(0<=x1,x2,y1,y2<=1000),计算并输出两点间的距离。
  • 输入

第一行输入一个整数n(0<n<=1000),表示有n组测试数据;随后每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。

  • 输出

对于每组输入数据,输出一行,结果保留两位小数。

#include <stdio.h> 
#include <math.h>

int main(){
    int T;
    double a;
    double b;
    double c;
    double d;
    double distance;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
        
        distance=sqrt((a-c)*(a-c)+(b-d)*(b-d));
        
        printf("%.2lf\n",distance);
    }
    return 0;
}

ASCII码排序

输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。
  • 输入

第一行输入一个数N,表示有N组测试数据。后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格。

  • 输出

对于每组输入数据,输出一行,字符中间用一个空格分开。

#include <stdio.h>

int main(){
    char a;
    char b;
    char c;
    char temp;
    int T;
    
    scanf("%d",&T);
    getchar();
    
    while(T--){
        scanf("%c%c%c",&a,&b,&c);
        getchar();
        
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
        
        if(a>c){
            temp=a;
            a=c;
            c=temp;
        }
        
        if(b>c){
            temp=b;
            b=c;
            c=temp;
        }
        
        printf("%c %c %c\n",a,b,c);
    }
    return 0;
}

数值统计

统计给定的n个数中,负数、零和正数的个数。
  • 输入

输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。

  • 输出

对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。

#include <stdio.h>
 
int main(){
    int n;
    int i;
    int a;
    int b;
    int c;
    double number;
     
    while(1){
        a=0;
        b=0;
        c=0;
        scanf("%d",&n);
         
        if(n==0)
            break;
             
        for(i=0;i<n;i++){
            scanf("%lf",&number);
             
            if(number<0)
                a++;
                 
            else if(number==0)
                b++;
                 
            else
                c++;
        }
         
        printf("%d %d %d\n",a,b,c);
    }
    return 0;
}

第三部分

最小公倍数

给定两个正整数,计算这两个数的最小公倍数。
  • 输入

输入包含多组测试数据,每组只有一行,包括两个不大于1000的正整数.

  • 输出

对于每个测试用例,给出这两个数的最小公倍数,每个实例输出一行。

#include <stdio.h>
 
int get_LCM(int a,int b);
 
int main(){
    int a;
    int b;
     
    while((scanf("%d%d",&a,&b))!=EOF){
        printf("%d\n",get_LCM(a,b));
    }
     
    return 0;
}
 
int get_LCM(int a,int b){
    int temp;
    int remainder;
    int A;
    int B;
     
    A=a;
    B=b;
     
    if(a<b){
        temp=a;
        a=b;
        b=temp;
    }
     
    while(a%b){
        remainder=a%b;
        a=b;
        b=remainder;
    }
     
    return A*B/b;
}

公约数和公倍数

小明被一个问题给难住了,现在需要你帮帮忙。问题是:给出两个正整数,求出它们的最大公约数和最小公倍数。
  • 输入

第一行输入一个整数n(0<n<=10000),表示有n组测试数据;随后的n行输入两个整数i,j(0<i,j<=32767)。

  • 输出

输出每组测试数据的最大公约数和最小公倍数

#include <stdio.h>

int main(){
    int a;
    int b;
    int temp;
    int T;
    int a_save;
    int b_save;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d%d",&a,&b);
        
        if(a<b){
            temp=a;
            a=b;
            b=temp;
        }
        
        a_save=a;
        b_save=b;
        while(a%b!=0){
            temp=a%b;
            a=b;
            b=temp;
        }
        
        printf("%d %d\n",b,a_save*b_save/b);
    }    
    return 0;
}

5个数求最值

设计一个从5个整数中取最小数和最大数的程序
  • 输入

输入只有一组测试数据,为五个不大于1万的正整数

  • 输出

输出两个数,第一个为这五个数中的最小值,第二个为这五个数中的最大值,两个数字以空格格开。

#include <stdio.h>

int main(){
    int number;
    int min;
    int max;
    int i;
    
    for(i=0;i<5;i++){
        scanf("%d",&number);
        
        if(i==0){
            min=number;
            max=number;
            continue;
        }
        
        if(number<min)
            min=number;
            
        if(number>max)
            max=number;
    }
    
    printf("%d %d\n",min,max);
    
    return 0;
}

素数筛子算法

现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
  • 输入

给出一个正整数数N(N<=2000000)、但N为0时结束程序。、测试数据不超过100组

  • 输出

将2~N范围内所有的素数输出。两个数之间用空格隔开

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 2000001
  
int main(){
    int i;
    int j;
    char flag[N];
    memset(flag,'0',N);
    flag[0]='1';
    flag[1]='1';
  
    for(i=2;i<=sqrt(N);i++){
        if(flag[i]=='0'){
            for(j=i*i;j<N;j+=i){
                flag[j]='1';
            }
        }
    }
  
    int number;
      
    while(1){
        scanf("%d",&number);
  
        if(number==0)
            break;
  
        for(i=2;i<=number;i++){
            if(flag[i]=='0')
                printf("%d ",i);
        }
              
        printf("\n");
    }
  
    return 0;
}

分数加减法

编写一个C程序,实现两个分数的加减法
  • 输入

输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。
数据以EOF结束
输入数据保证合法

  • 输出

对于输入数据的每一行输出两个分数的运算结果。 注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

#include <stdio.h> 

int gcd(int a,int b);

int main(){
    int a;
    int b;
    int c;
    int d;
    char sign;
    int fenmu;
    int fenzi;
    char temp;
    
    while(scanf("%d/%d%c%d/%d",&a,&b,&sign,&c,&d)!=EOF){
        fenmu=b*d/gcd(b,d);
        
        if(sign=='+')
            fenzi=a*fenmu/b+c*fenmu/d;
        
        else
            fenzi=a*fenmu/b-c*fenmu/d;
            
        if(fenzi==0){  //分子为0直接输出0 
            printf("0\n");
            continue;
        }
        
        temp='+';
        if(fenzi<0){  //当为负数时,化为正数,标记负号 
            fenzi=-fenzi;
            temp='-';
        }
        
        if(temp=='-')  //有负号时输出负号 
            printf("-");
        
        if(fenzi%fenmu==0)  //如果整除时直接输出商 
            printf("%d\n",fenzi/fenmu);
            
        else   //不整除时以分数的形式输出 
            printf("%d/%d\n",fenzi/gcd(fenmu,fenzi),fenmu/gcd(fenmu,fenzi));
    }
    return 0;
}

int gcd(int a,int b){
    int temp;
    
    if(a<b){
        temp=a;
        a=b;
        b=temp;
    }
    
    while(a%b!=0){
        temp=a%b;
        a=b;
        b=temp;
    }
    
    return b;
}
最后修改:2022 年 11 月 24 日
如果觉得我的文章对你有用,奖励一杯咖啡吧!