admin管理员组

文章数量:1794759

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

[百战成神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入门题,对新手很友好,能够帮助新手快速上手,战胜对于编程的恐惧,求三连!凡人在这里谢谢大家的观看,如果觉得写的详细,能看明白,希望多多支持!

  

 

 

 

 

 

 

本文标签: 小牛凡人百战语言详细