💘作者:你我皆为凡人
💘名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!
💘觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!
前言
内容超详细!!手把手教你如何去解析编程!如果你能听懂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入门题,对新手很友好,能够帮助新手快速上手,战胜对于编程的恐惧,求三连!凡人在这里谢谢大家的观看,如果觉得写的详细,能看明白,希望多多支持!