前言

继续上文的部分。此为第七部分-第九部分。

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



练习题总览

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

第七部分

字符串替换

编写一个程序实现将字符串中的所有"you"替换成"we"
  • 输入

输入包含多行数据
每行数据是一个字符串,长度不超过1000
数据以EOF结束

  • 输出

对于输入的每一行,输出替换后的字符串

#include <stdio.h> 
#include <string.h>

int main(){
    char c;
    char s[1001];
    int i;
    int length;
    
    while(scanf("%c",&c)!=EOF){
        i=0;
        while(c!='\n'){
            s[i]=c;
            i++;
            c=getchar();
        }
        s[i]='\0';
        length=strlen(s);
        
        for(i=0;i<length-2;i++){  //这里处理很巧妙,直接赋值即可,真是高 
            if(s[i]=='y' && s[i+1]=='o' && s[i+2]=='u'){
                s[i]='w';
                s[i+1]='e';
                s[i+2]='\0';  //赋值为'\0',是因为其他位置的字符不可能为'\0'   
            }        
        }
        
        for(i=0;i<length;i++){
            if(s[i]!='\0')
                printf("%c",s[i]);
        }
            
        printf("\n");
    }    
    return 0;
}

字母统计

现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个。
  • 输入

第一行输入一个正整数T(0<T<25)随后T行输入一个字符串s,s长度小于1010。

  • 输出

每组数据输出占一行,输出出现次数最多的字符;

#include <stdio.h> 
#include <string.h>

int main(){
    char s[1100];
    int T;
    int amount[27];
    int i;
    int max;
    char c;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%s",&s);
        
        memset(amount,0,sizeof(int)*27);
        
        for(i=0;s[i]!='\0';i++){
            amount[s[i]-'a'+1]++;
        }
        
        for(i=1;i<=26;i++){
            if(amount[i]!=0){
                c=i-1+'a';
                max=amount[i];
                break;
            }
        }
        
        for(i=1;i<=26;i++){
            if(amount[i]>max){
                c=i-1+'a';
                max=amount[i];
            }
        }
        
        printf("%c\n",c);
    }
    return 0;
}

字符串逆序输出

给定一行字符,逆序输出此行(空格.数字不输出)
  • 输入

第一行是一个整数N(N<10)表示测试数据的组数)
每组测试数据占一行,每行数据中间有且只有一个空格(这样你可以把此行当成两个字符串读取)。
每行字符长度不超过40
并且保证输入的字符只有空格(1个),数字,小写字母三种

  • 输出

对应每行测试数据,逆序输出(空格和数字不输出)

#include <stdio.h> 
#include <string.h>
#include <ctype.h>

int main(){
    char s[50];
    int T;
    int length;
    int i;
    
    scanf("%d",&T);
    getchar();
    
    while(T--){
        gets(s);
        length=strlen(s);
        
        for(i=length-1;i>=0;i--){
            if(isalpha(s[i]))
                printf("%c",s[i]);
        }
        
        printf("\n");
    }
    return 0;
}

交换输出

输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。(如果这个第一个数就是最小的数,则保持原样输出,如果最小的数有相同的按照前面的交换)
  • 输入

输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。

  • 输出

对于每组输入数据,输出交换后的数列,每组输出占一行。

#include <stdio.h> 

int main(){
    int n;
    int number[101];
    int i;
    int min;
    int flag;
    int temp;
    
    while(1){
        scanf("%d",&n);
        
        if(n==0)
            break;
            
        for(i=0;i<n;i++)
            scanf("%d",&number[i]);
            
        flag=0;
        min=number[0];
        
        for(i=0;i<n;i++){
            if(number[i]<min){
                min=number[i];
                flag=i;
            }
        }
        
        temp=number[0];
        number[0]=number[flag];
        number[flag]=temp;
        
        for(i=0;i<n;i++){
            if(i!=0)
                printf(" ");
                
            printf("%d",number[i]);
        }
        printf("\n");
    }
    return 0;
}

比较字母大小

任意给出两个英文字母,比较它们的大小,规定26个英文字母A,B,C.....Z依次从大到小。
  • 输入

第一行输入T,表示有T组数据;接下来有T行,每行有两个字母,以空格隔开;

  • 输出

输出各组数据的比较结果,输出格式见样例输出;(注意输出严格按照输入的顺序即输入是A B,输出时必须是A?B)

#include <stdio.h> 

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

第八部分

猴子吃桃问题

有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法,吃掉剩下桃子的一半又多一个,天天如此,到第m天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个? (m<29)
  • 输入

第一行有一个整数n,表示有n组测试数据(从第二行开始,每一行的数据为:第m天);

  • 输出

每一行数据是桃子的总个数

#include <stdio.h> 

int main(){
    int T;
    int m;
    int i;
    int result;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d",&m);
        
        result=1;
        for(i=1;i<=m;i++)
            result=(result+1)*2;
            
        printf("%d\n",result);    
    }
    return 0;
}

九九乘法表

小时候学过的九九乘法表也许将会扎根于我们一生的记忆,现在让我们重温那些温暖的记忆,请编程输出九九乘法表.
现在要求你输出它的格式与平常的 不同啊! 是那种反过来的三角形啦,具体如下图:
每两个式子之前用一个空格 隔开。。。
  • 输入

第一有一个整数N,表示有N组数据(N<10)接下来由N行,每行只有一个整数M(1<=M<=9);

  • 输出

对应每个整数M,根据要求输出乘法表的前N行,具体格式参见输入输出样例和上图.每两组测试数据结果之间有一个空行隔开,

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

int main(){
    int T;
    int n;
    int i;
    int j;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d",&n);
        
        for(i=1;i<=n;i++){
            for(j=i;j<=9;j++){
                if(j!=i)
                    printf(" ");
                
                printf("%d*%d=%d",i,j,i*j);
            }
            printf("\n");
        }
        
        if(T!=0)
            printf("\n");    
    }
    return 0;
}

16进制的简单运算

现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果。
  • 输入

第一行输入一个正整数T(0<T<100000)
接下来有T行,每行输入一个字符串s(长度小于15)字符串中有两个数和一个加号或者一个减号,且表达式合法并且所有运算的数都小于31位

  • 输出

每个表达式输出占一行,输出表达式8进制的结果。

#include <stdio.h>

int main(){
    int a;
    int b;
    int sum;
    int T;
    char c;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%x%c%x",&a,&c,&b);
        
        if(c=='+')
            sum=a+b;
            
        else
            sum=a-b;
            
        if(sum<0){   //只有当sum为__int64类型时,才要进行正负的判断
            sum=-sum;
            printf("-");
        }
        
        printf("%o\n",sum);
    }
    
    
    
    return 0;
}

三角形面积

给你三个点,表示一个三角形的三个顶点,现你的任务是求出该三角形的面积
  • 输入

每行是一组测试数据,有6个整数x1,y1,x2,y2,x3,y3分别表示三个点的横纵坐标。(坐标值都在0到10000之间)输入0 0 0 0 0 0表示输入结束。测试数据不超过10000组

  • 输出

输出这三个点所代表的三角形的面积,结果精确到小数点后1位(即使是整数也要输出一位小数位)

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

int main(){
    int x1;
    int y1;
    int x2;
    int y2;
    int x3;
    int y3;
    double s;
    
    while(1){
        scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
        
        if(x1==0 && y1==0 && x2==0 && y2==0 && x3==0 && y3==0)
            break;
                
        s=fabs((double)x1*y2-x2*y1+x3*y1-x1*y3+x2*y3-x3*y2)/2;
    
        printf("%.1lf\n",s);
    }
    
    return 0;
}

平方和与立方和

给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
  • 输入

输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。

  • 输出

对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。你可以认为32位整数足以保存结果。

#include <stdio.h>
 
int main(){
    int a;
    int b;
    int i;
    int temp;
    int oushu_sum;
    int jishu_sum;
     
    while((scanf("%d%d",&a,&b))!=EOF){
        oushu_sum=0;
        jishu_sum=0;
         
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
         
        for(i=a;i<=b;i++){
            if(i%2==0){
                oushu_sum+=(i*i);
            }
             
            else
                jishu_sum+=(i*i*i);
        }
         
        printf("%d %d\n",oushu_sum,jishu_sum);
    }
     
    return 0;
}

第九部分

水仙花数

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:

“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。

现在要求输出所有在m和n范围内的水仙花数。

  • 输入

输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。

  • 输出

对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。

#include <stdio.h>
 
int main(){
    int a;
    int b;
    int temp;
    int i;
     
    int number1;
    int number2;
    int number3;
    int flag;
     
    while((scanf("%d%d",&a,&b))!=EOF){
        flag=0;
        if(a>b){
            temp=a;
            a=b;
            b=temp;
        }
         
        for(i=a;i<=b;i++){
            number1=i%10;
            number2=i/10%10;
            number3=i/100;
             
            if(i==(number1*number1*number1+number2*number2*number2+number3*number3*number3)){
                if(flag==0)
                    printf("%d",i);
                     
                else
                    printf(" %d",i);
                flag=1;
            }
        }
         
        if(flag==0)
            printf("no");
             
        printf("\n");
    }
     
    return 0;
}

多项式求和

多项式的描述如下:

1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...

现在请你求出该多项式的前n项的和。

  • 输入

输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。

  • 输出

对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。

#include <stdio.h>
 
double get_result(int number);
 
int main(){
    int n;
    int number;
     
    scanf("%d",&n);
     
    while(n--){
        scanf("%d",&number);
         
        printf("%.2lf\n",get_result(number));
    }
     
    return 0;
}
 
double get_result(int number){
    int i;
    int temp=1;
    double result=0;
     
    for(i=1;i<=number;i++){
        result+=(1.0/i*temp);
        temp=-temp;
    }
     
    return result;
}

绝对值排序

输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
  • 输入

输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理

  • 输出

对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。

#include <stdio.h>
#include <math.h>
 
int main(){
    int n;
    int number[101];
    int i;
    int j;
    int temp;
     
    while(1){
        scanf("%d",&n);
         
        if(n==0)
            break;
             
        for(i=0;i<n;i++)
            scanf("%d",&number[i]);
             
        for(i=0;i<n-1;i++){
            for(j=i+1;j<n;j++){
                if(fabs(number[i])<(fabs(number[j]))){
                    temp=number[i];
                    number[i]=number[j];
                    number[j]=temp;
                }
            }
        }
         
        for(i=0;i<n;i++){
            printf("%d",number[i]);
             
            if(i!=n-1)
                printf(" ");
        }
         
        printf("\n");
         
    }
     
         
    return 0;
}

首字母变大写

输入一个英文句子,将每个单词的第一个字母改成大写字母。
  • 输入

输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。

  • 输出

请输出按照要求改写后的英文句子。

#include <stdio.h>
#include <ctype.h>
 
int main(){
    char c;
    int flag;
     
    while((scanf("%c",&c))!=EOF){
        flag=1;
         
        while(c!='\n'){
            if(islower(c)!=0 && flag==1){
                c=toupper(c);
                flag=0;
            }
             
                 
            if(c==' ')
                flag=1;
             
            printf("%c",c);
             
            c=getchar();
        }
         
        printf("\n");
    }
             
    return 0;
}

a/b + c/d

给你2个分数,求他们的和,并要求和为最简形式。
  • 输入

输入首先包含一个正整数T(T<=1000),表示有T组测试数据,然后是T行数据,每行包含四个正整数a,b,c,d(0<a,b,c,d<1000),表示两个分数a/b 和 c/d。

  • 输出

对于每组测试数据,输出两个整数e和f,表示a/b + c/d的最简化结果是e/f,每组输出占一行。

#include <stdio.h>

int get_gcd(int a,int b);

int main(){
    int T;
    int a;
    int b;
    int c;
    int d;
    int lcm;
    int temp;
    int gcd;
    
    scanf("%d",&T);
    
    while(T--){
        scanf("%d%d%d%d",&a,&b,&c,&d);
        lcm=b*d/get_gcd(b,d);
        
        temp=(lcm/b*a+lcm/d*c);
        gcd=get_gcd(temp,lcm);
        
        printf("%d %d\n",temp/gcd,lcm/gcd);    
    }        
    return 0;
}

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