且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[百战成神4]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

更新时间:2022-10-02 08:51:19

 ????作者:你我皆为凡人

 

 ????名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!

 ????觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

[百战成神4]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

文章目录

前言

 ????BC34 进制A+B

????描述

????输入描述:

????输出描述:

????示例1

????解析:

???? 代码如下:

????BC37 网购

????描述

????输入描述:

????输出描述:

????示例1

????示例2

????解析:

???? 代码如下:

????BC39 争夺前五名

????描述

????输入描述:

????输出描述:

????示例1

????示例2

????解析1:

????解析2:

        ???? 代码如下:

???? BC40 竞选社长

????描述

????输入描述:

????输出描述:

????示例1

????解析:

???? 代码如下:两种

????BC41 你是天才吗?

????描述

????输入描述:

????输出描述:

????示例1

????解析:

???? 代码如下:两种

????BC42 完美成绩

????描述

????输入描述:

????输出描述:

????示例1

????解析:

???? 代码如下:

????BC43 及格分数

????描述

????输入描述:

????输出描述:

????示例1

????示例2

????解析:

???? 代码如下:

????BC44 判断整数奇偶性

????描述

????输入描述:

????输出描述:

????示例1

????解析:

???? 代码如下:

????BC45 最高分数

????描述

????输入描述:

????输出描述:

????示例1

????解析:

???? 代码如下:

????BC46 判断是元音还是辅音

????描述

????输入描述:

????输出描述:

????示例

????解析1:

????解析2:

???? 代码如下:

总结


前言

内容超详细!!手把手教你如何去解析编程!如果你能听懂C语言,但是一上手就不会了,听完我讲解的题目后,相信你的写代码能力会逐步上升,战胜对编程的恐惧!


提示:以下是本篇文章正文内容,下面案例可供参考


????BC34 进制A+B

????描述

输入一个十六进制数a,和一个八进制数b,输出a+b的十进制结果(范围-231~231-1)。

????输入描述:

一行,一个十六进制数a,和一个八进制数b,中间间隔一个空格。

????输出描述:

一行,a+b的十进制结果。

????示例1

输入:

0x12 05

输出:

23

????解析:

????1,定义a和b两个数,因为要十六进制与八进制 ,那么在源头,输入的时候就格式控制为十六进制与八进制就好了,分别是x与o

????2,因为无论是八进制还是十六进制都是整数,所以整数输出a与b的和

???? 代码如下:

#include<stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%x %o",&a,&b);
    printf("%d",a+b);
    return 0;
}


????BC37 网购

????描述

KiKi非常喜欢网购,在一家店铺他看中了一件衣服,他了解到,如果今天是“双11”(11月11日)则这件衣服打7折,“双12” (12月12日)则这件衣服打8折,如果有优惠券可以额外减50元(优惠券只能在双11或双12使用),求KiKi最终所花的钱数。

数据范围:衣服价格满足 1 \le val \le 100000 \1≤val≤100000 

????输入描述:

一行,四个数字,第一个数表示小明看中的衣服价格,第二和第三个整数分别表示当天的月份、当天的日期、第四个整数表示是否有优惠券(有优惠券用1表示,无优惠券用0表示)。 注:输入日期保证只有“双11”和“双12”。

????输出描述:

一行,小明实际花的钱数(保留两位小数)。(提示:不要指望商家倒找你钱)

????示例1

输入:

1000.0 11 11 1

输出:

650.00

????示例2

输入:

999.8 12 12 0

输出:

799.84

????解析:

????1,首先审题,需要输入四个,分别是价格,月份,日期,与优惠券,而价格需要小数

????2,分析一下题,需要的条件

        ????1,这时候需要判断了,如果月和日都等于11,价格先乘上0.7的折扣

        ????2,如果月和日都等于12,价格先乘上0.8的折扣

        ????3,然后定义一个最后的价格,因为定义的优惠券只能是0与1,最后价格等于打完折的价格或者原价格减去优惠券乘上一个50 因为1乘50没有变化,而0乘五十刚好是0

        ????4,最后,注意商家是不会倒找你钱的,还要考虑一下负数的情况,所以判断,如果小于0,输入0.00,反之则输出最后结果

???? 代码如下:

#include<stdio.h>
int main()
{
    double price = 0.0;
    int month = 0;
    int day = 0;
    int s = 0;//优惠券
    double last = 0.0; //最后的价格
    scanf("%lf %d %d %d",&price,&month,&day,&s);
    if(month == 11 && day == 11)
    {
        price*=0.7;
    }
     if(month == 12 && day == 12)
    {
        price*=0.8;
    }
    last = price -s*50;
    if(last < 0)
    {
        printf("0.00");
    }
    else 
    {
        printf("%.2lf",last);
    }
    return 0;
}


????BC39 争夺前五名

????描述

期中考试开始了,大家都想取得好成绩,争夺前五名。从键盘输入 n 个学生成绩,输出每组排在前五高的成绩。

数据范围: 5 \le n \le 50 \5≤n≤50  ,成绩采取百分制并不会出现负数

????输入描述:

两行,第一行输入一个整数,表示n个学生(>=5),第二行输入n个学生成绩(整数表示,范围0~100),用空格分隔。

????输出描述:

一行,输出成绩最高的前五个,用空格分隔。

????示例1

输入:

6

99 45 78 67 72 88

输出:

99 88 78 72 67

????示例2

输入:

5

10 20 30 40 50

输出:

50 40 30 20 10

????解析1:

????1,输入需要两行,先定义n个学生,并输入第一行

????2,第二行需要输入成绩,定义一个数组来存放n个学生的成绩,因为n<=50,所以最大不会超过50,然后用for循环遍历输入每个成绩,注意空格

????3,分析,如何实现输出最高的前五个,这时候需要排序,而最简单的就是冒泡排序:

        ????1,冒泡排序,如 9,8,7,6,5,4,3,2,1,0  这10个数字,左右相邻的两两相比,如果大于右边,则左右交换 

        ????2,就像下面一样:

                ◼  9 8 7 6 5 4 3 2 1 0

                ◼  8 9 7 6 5 4 3 2 1 0

                ◼ 8 7 9 6 5 4 3 2 1 0 

                ◼  。。。。。。

                ◼最后是  8 7 6 5 4 3 2 1 0 9 ,最后把9 给排序到最后 ,以此类推:

                ◼  8 7  6 5 4 3 2 1 0 9

                ◼  7 8 6 5 4 3 2 1 0 9  注意 9已经不算入范围了

                ◼ 。。。。

        ????4,掌握冒泡排序的原理以后,用代码的方式写出来

                 ????1,开始for循环,需要确定一趟要对照的趟数,比如 10个需要9次对照,所以是小于n-1

                 ????2,确定每次需要替换多少次,因为每次最大的放后面就不需要在替换算入里面了,所以需要每次减去i  

                 ????3, 如果第一个大于第二个,创建一个临时变量,然后交换

         ????5,把最后5个打印出来,最后一个是n-1 因为下标从0开始

????解析2:

          ????1,因为步骤和上面一样,所以不细讲,主要让大家认识一下,C语言中库函数有专门两个比较的函数 qsort() 

          ????2,void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) )总共有四个,下面分别讲解:

                 ????void *base,要比较的,就是arr里面的成绩

                 ????size_t num,元素个数,为n

                 ????size_t width,元素大小,是整形 4

                 ????int (__cdecl *compare )(const void *elem1, const void *elem2 ) ),最重要的就是这个,这个是个函数指针,参数是const void*    如果第一个-第二个大于0,返回大于0的数,小于0,返回小于,等于0,返回等于0的数,因为要取到e1 首先讲e1转换为整形指针然后解应用,拿到e1,e2相同的道理

          ????3,以下与上一个相同

       ???? 代码如下:

#include<stdio.h>
int main()
{
    int n = 0;
    int arr[50] = {0};//因为小于等于50
    scanf("%d",&n); 
    int i = 0;
    for(i=0;i<n;i++)
    {
        scanf("%d ",&arr[i]);
    }
    //开始冒泡排序,一趟的趟数
    for(i=0;i<n-1;i++)
    {
        //一趟替换的次数
        int j = 0;
        for(j=0;j<n-1-i;j++)
        {
           //如果左边比右边大,进行交换
            if(arr[j] > arr[j+1])
            {
                int tmp = 0;
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
         }
    }
    for(i=n-1;i>=n-5;i--)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
int com_int(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int arr[50] = {0};
    int i = 0;
    for(i=0;i<n;i++)
    {
        scanf("%d ",&arr[i]);
    }
    qsort(arr,n,4,com_int);
    for(i=n-1;i>=n-5;i--)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}


???? BC40 竞选社长

????描述

假设你们社团要竞选社长,有两名候选人分别是A和B,社团每名同学必须并且只能投一票,最终得票多的人为社长.

????输入描述:

一行,字符序列,包含A或B,输入以字符0结束。

????输出描述:

一行,一个字符,A或B或E,输出A表示A得票数多,输出B表示B得票数多,输出E表示二人得票数相等。

????示例1

输入:

ABBABBAAB0

输出:

B

????解析:

????1,要求输入一行字符,可以一个一个输入,用getchar,因为之前讲过,所以提一个新的库函数gets,用来输入一串字符的,因为是一串,直接用数组来定义,没有题大小,定个100就差不多了

????2,分析,因为输入字符0结束,所以定义循环,不等于‘0’为条件,一旦等于0就停止,在里面判断条件,如果元素等于A ,定义一个a++,如果等于B,则定义b++,然后让i++,让可以进行下一次判断

????3,如果a>b,则输出A,如果a<b,则输出B,等于则输出E

???? 代码如下:两种

#include<stdio.h>
int main()
{
    char buf[100] = {0};
    gets(buf);
    int i = 0;
    int a = 0;
    int b = 0;
    while(buf[i] != '0')
    {
        if(buf[i] == 'A')
        {
            a++;
        }
        if(buf[i] == 'B')
        {
            b++;
        }
        i++;
    }
    if(a>b)
    {
        printf("A\n");
    }else if(a<b)
    {
        printf("B\n");
    }else{
        printf("E\n");
    }
    return 0;
}
 
 
#include<stdio.h>
int main()
{
    char ch = 0;;
   int flag = 0;
    while(((ch = getchar()) != '0') && ch != EOF)
    {
        if(ch == 'A')
        {
            flag++;
        }
        if(ch == 'B')
        {
            flag--;
        }
    }
    if(flag>0)
    {
        printf("A\n");
    }else if(flag<0)
    {
        printf("B\n");
    }else{
        printf("E\n");
    }
    return 0;
}



????BC41 你是天才吗?

????描述

据说智商140以上者称为天才,KiKi想知道他自己是不是天才,请帮他编程判断。输入一个整数表示一个人的智商,如果大于等于140,则表明他是一个天才,输出“Genius”。

????输入描述:

多组输入,每行输入包括一个整数表示的智商。

????输出描述:

针对每行输入,输出“Genius”。

????示例1

输入:

160

输出:

Genius

????解析:

????1,题目比较简单,需要注意的是要多组输入,而多组输入需要循环,要让循环可以停下来,EOF在前几篇解释过

????2,还有一种就是在输入前加一个~按位取反,如何理解呢 ?其实EOF是-1,而按位取反是把-1的二进制取反   -1在二进制里存放的是补码,11111111111111111111111111111111,如果安位取反则是00000000000000000000000000000000,则是0

????3,判断,如果大于等于140,则输出条件,注意要换行,因为是多组

???? 代码如下:两种

#include<stdio.h>
int main()
{
    int iq = 0;
    while(scanf("%d",&iq) != EOF)
    {
        if(iq>=140)
        {
            printf("Genius\n");
        }
    }
    return 0;
}
#include<stdio.h>
int main()
{
    int iq = 0;
    while(~scanf("%d",&iq))
    {
        if(iq>=140)
        {
            printf("Genius\n");
        }
    }
    return 0;
}


????BC42 完美成绩

????描述

KiKi想知道他的考试成绩是否完美,请帮他判断。从键盘输入一个整数表示的成绩,编程判断成绩是否在90~100之间,如果是则输出“Perfect”。

????输入描述:

多组输入,每行输入包括一个整数表示的成绩(90~100)。

????输出描述:

针对每行输入,输出“Perfect”。

????示例1

输入:

98

输出:

Perfect

????解析:

????1,这道题与上一道相似,也是多组输入,就不多说了

????2,判断的时候注意,要写成&&的形式

????3,按条件输出,注意换行

???? 代码如下:

#include<stdio.h>
int main()
{
    int score = 0;
    while(~scanf("%d ",&score))
    {
        if(score >= 90 && score <= 100)
        {
            printf("Perfect\n");
        }
        return 0;
    }
}


????BC43 及格分数

????描述

KiKi想知道他的考试分数是否通过,请帮他判断。从键盘任意输入一个整数表示的分数,编程判断该分数是否在及格范围内,如果及格,即:分数大于等于60分,是输出“Pass”,否则,输出“Fail”。

????输入描述:

多组输入,每行输入包括一个整数表示的分数(0~100)。

????输出描述:

针对每行输入,输出“Pass”或“Fail”。

????示例1

输入:

94

输出:

Pass

????示例2

输入:

44

输出:

Fail

????解析:

????1,这道题与上一道相似,也是多组输入,就不多说了,可以看到掌握了一种方法,思路,其实类型差不多的做起来就很简单

????2,判断并输出,注意换行

???? 代码如下:

#include<stdio.h>
int main()
{
    int score = 0;
    while(~scanf("%d",&score))
    {
        if(score >= 60)
        {
            printf("Pass\n");
        }
        else
        {
            printf("Fail\n");
        }
    }
            return 0;
}


????BC44 判断整数奇偶性

????描述

KiKi想知道一个整数的奇偶性,请帮他判断。从键盘任意输入一个整数(范围-231~231-1),编程判断它的奇偶性。

????输入描述:

多组输入,每行输入包括一个整数。

????输出描述:

针对每行输入,输出该数是奇数(Odd)还是偶数(Even)。

????示例1

输入:

4

7

输出:

Even

Odd

????解析:

????1,一样的思路,多组输入,判断条件,注意对2取模,如果等于1,则是奇数,如果等于0,则是偶数

????2,输出,注意换行

???? 代码如下:

#include<stdio.h>
int main()
{
    int n = 0;
    while(~scanf("%d",&n))
    {
        if(n%2==1)
        {
            printf("Odd\n");
            
        }
        else{
            printf("Even\n");
        }
    }
    return 0;
}


????BC45 最高分数

????描述

KiKi参加了语文、数学、外语的考试,请帮他判断三科中的最高分。从键盘任意输入三个整数表示的分数,编程判断其中的最高分。

数据范围: 0 \le n \le 100 \0≤n≤100 

????输入描述:

输入一行包括三个整数表示的分数(0~100),用空格分隔。

????输出描述:

输出为一行,即三个分数中的最高分。

????示例1

输入:

94 98 99

输出:

99

????解析:

????1,定义三个数,多组输入,每次输入三个数

????2,判断三个数的最大值,简单介绍一下三目运算符:如条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值,则定义max,n1大于n2吗?大于则等于n1,否则等于n2

,然后拿max与n3比较,大于则是max,小于则是n3,最后输出max

???? 代码如下:

#include<stdio.h>
int main()
{
    int n1 = 0;
    int n2 = 0;
    int n3 = 0;
    while(~scanf("%d %d %d",&n1,&n2,&n3));
    {
        int max = n1>n2?n1:n2;
        max = max>n3?max:n3;
        printf("%d\n",max);
    }
    return 0;
}


????BC46 判断是元音还是辅音

????描述

KiKi开始学习英文字母,BoBo老师告诉他,有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请帮他编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。

????输入描述:

多组输入,每行输入一个字母。

????输出描述:

针对每组输入,输出为一行,如果输入字母是元音(包括大小写),输出“Vowel”,如果输入字母是非元音,输出“Consonant”。

????示例

输入:

A

b

输出:

Vowel

Consonant

????解析1:

????1,定义字符多组输入

????2,如果一个一个写if语句的话太麻烦,因为元音字母大小写有10个,干脆把他们都放一起,然后用for循环遍历,如果输入的字符等于数组里面的任意一个,就打印元音,打印完就不要继续与数组里的比较了,break停止

????3,如果等i等于10的时候,说明数组里都不是,然后打印非元音

????解析2:

????1,定义字符多组输入

????2,也可以使用strchr来判断输入的字符有没有在数组里出现过,如果出现过,则返回一个数组的地址,如果没有出现,则返回一个空指针

???? 代码如下:

#include<stdio.h>
int main()
{
    char ch = 0;
    char arr[10] = "AaEeIiOoUu";
    int i = 0;
    while(~(ch= getchar()))
    {
        for(i=0;i<10;i++)
        {
            if(ch == arr[i])
            {
                printf("Vowel\n");
                break;
            }
        }
        if(i==10)
        {
            printf("Consonant\n");
        }
        getchar();
    }
    return 0;
}
#include<stdio.h>
int main()
{
    char ch = 0;
    char arr[10] = "AaEeIiOoUu";
    while(~(ch= getchar()))
    {
       if(strchr(arr,ch))//ch字符有没有在数组里出现
       {
           printf("Vowel\n");
       }
        else
        {
            printf("Consonant\n");
        }
        getchar();
    }
    return 0;
}

总结

以上是凡人给大家准备的10道牛客oj入门题,对新手很友好,能够帮助新手快速上手,战胜对于编程的恐惧,求三连!凡人在这里谢谢大家的观看,如果觉得写的详细,能看明白,希望多多支持!

  [百战成神4]C语言之凡人暴刷小牛【超详细解析,掌握每道题】[百战成神4]C语言之凡人暴刷小牛【超详细解析,掌握每道题】