电专c语言oj探秘2

题组22

本题组来源于西电oj的22题组(hqy老师课程课后习题),题目还是很简单,依旧适合萌新。

关于西电oj链接替换(已知hqy老师课程适用)的问题:

从第二份题组开始,所有的题目都会在新的链接发布,原本的链接将会被弃用。

电专必看

如果你提交的时候一直编译错误:

请确保你提交的题目选择的文件匹配。

请确保你选择的编译选项正确,一般有两个选项visual c++和GNU C/C++(通常其他的编译器如devc++选择这个)。编者因为选错报错了一次

请确保你使用的标准是ANSIC或者C99,没有任何奇奇怪怪的东西(如vs的scanf_s函数等)。

如果你在本地一直编译错误或输出错误:

阅读电专编译小手册

在编译的时候开启-Wall,一般你提问的时候,不接受任何警告问题。

别在ACM群提问,作业的报错一般在里面问都会被喷。

本题解仅供学习参考使用,懂的都懂。

所以文件不给了(老子太懒啦~~~)

T1 车牌限行

时间限制:1 秒
内存限制:256KB

问题描述:
受雾霾天气影响,某市决定当雾霾指数超过设定值时对车辆进行限行,假设车牌号全为数字,且长度不超过6位,限行规则如下:
(1)限行时间段只包括周一至周五,周六周日不限行;
(2)如果雾霾指数低于200,不限行;
(3)如果雾霾指数大于等于200且低于400,每天限行两个尾号的汽车,周一限行1和6,周二限行2和7,周三限行3和8,周四限行4和9,周五限行5和0;
(4)如果雾霾指数大于等于400,每天限行五个尾号的汽车,周一、周三和周五限行1,3,5,7,9,周二和周四限行0,2,4,6,8。

现在给出星期几、雾霾指数和车牌号,判断该车牌号是否限行。

输入说明
输入分为三个整数,第一个整数表示星期几(17,1表示周一,2表示周二,依次类推,7表示周日),第二个整数表示雾霾指数(0600),第三个整数表示车牌号,整数之间用空格分隔。

输出说明
输出为两个部分,第一部分为车牌最后一位数字,第二部分为限行情况,限行输出yes,不限行输出no。

输入样例
输入样例1
4 230 80801
输入样例2
3 300 67008

输出样例
输出样例1
1 no
输出样例2
8 yes

本题小解析

这道题的判断主要由这么几个,按照优先度排序是这样的:

1.今天星期几(仅周一到周五限行,周末不限行,如果是疯狂星期四,v我50

2.雾霾指数(200,400分别为临界点)

3.车牌尾号(如何实现计算车牌尾号?%10就行)

注意点比如说输出格式问题取余问题等。通常这题容易出现七八十分的情况,需要自己检查自己的条件语句写的有无出错和重复遗漏。

弱鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
int main(){
int a,b,c,num;
bool xianxing=false;
scanf("%d %d %d",&a,&b,&c);
num=c%10;
if(a==6||a==7)xianxing=false;
else{
if(b<200)xianxing=false;
else if(b>=200&&b<400){
switch (a){
case 1:if(num==1||num==6)xianxing=true;break;
case 2:if(num==2||num==7)xianxing=true;break;
case 3:if(num==3||num==8)xianxing=true;break;
case 4:if(num==4||num==9)xianxing=true;break;
case 5:if(num==5||num==0)xianxing=true;break;
}
}else {
switch (a){
case 1:case 3:case 5:if(num%2!=0)xianxing=true;break;
case 2:case 4:if(num%2==0)xianxing=true;break;
}
}
}
printf("%d ",num);
if(xianxing==true)printf("yes");
else printf("no");
return 0;
}

弱鸡代码里面用到了bool变量,方便最后的输出。

用if…else…或者swtich…case…语句都可。

T2 阶梯电价计费

类别:流程控制

时间限制:2S

内存限制:10000Kb

问题描述:

电价分三个档次,[0,110]度电,每度电0.5元;(110,210]度电,超出110部分每度电0.55元,超过210度电,超出210部分每度电0.70元,给出一个家庭一月用电量,请计算出应缴的电费(四舍五入,保留小数点后两位小数)。

输入说明:

输入数据为一个正实数,表示一月用电量

输出说明:

输出应缴电费,四舍五入保留2位小数。

输入样例:

输入样例1

100

输入样例2

200

输入样例3

329.75

输出样例:

输出样例1

50.00

输出样例2

104.50

输出样例3

193.82

本题小解析

一个简单的计价判断问题。根据不同的阶梯计算出价格就行。

注意数据格式问题精度问题

弱鸡代码

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
double a,num;
scanf("%lf",&a);
if(a>0&&a<=110)num=a*0.5;
else if(a>110&&a<=210)num=55+(a-110)*0.55;
else num=110+(a-210)*0.7;
printf("%.2f",num);
return 0;
}

T3 计算某月天数

类别:流程控制

时间限制:2S

内存限制:10000Kb

问题描述:

每年的1,3,5,7,8,10,12月有31天,4,6,9,11月有30天,闰年2月29天,其他年份2月28天,给定年份和月份求该月的天数

输入说明:

输入由两个正整数a和b构成,a表示年份,b表示月份,a和b之间用空格分隔

输出说明:

根据年份和月份计算该月天数并输出

输入样例

输入样例1

2000 3

输入样例2

2001 2

输出样例

输出样例1

31

输出样例2

28

本题小解析

本题其实是一个月份判断和年份判断的综合题。

注意闰年的定义:年份为4的倍数,不是100的倍数但为400倍数的,是闰年。

弱鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(){
int a,b;
scanf("%d %d",&a,&b);
switch(b){
case 1:case 3:case 5:case 7:case 8:case 10:case 12:printf("31");break;
case 4:case 6:case 9:case 11:printf("30");break;
case 2:
if(a%4==0){
if(a%100==0){
if(a%400==0)printf("29");
else printf("28");
}else
printf("29");
}else
printf("28");
}
return 0;
}

用if…else也可。

T4 寻找最大整数

类别:流程控制

时间限制:1S

内存限制:1000Kb

问题描述
从键盘输入四个整数,找出其中的最大值并将其输出。

输入说明
输入4个整数,用空格分隔

输出说明
输出值最大的一个整数

输入样例
25 99 -46 0

输出样例
99

本题小解析

如何判断一个数最大呢?或许直接用if来比较a,b,c,d这四个数的大小并不合适。

但是,我们可以先选出一个数,让他和其他的数pk,如果这个数比其他的数小,换一个数当最大数,而如果这个数最大,就可以保留下来。

这样的话只需要n-1次比较就可以选出n个数里面的最大数。

弱鸡代码

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(){
int a,b,c,d,max;
scanf("%d %d %d %d",&a,&b,&c,&d);
max=a;
if(max<b)max=b;
if(max<c)max=c;
if(max<d)max=d;
printf("%d",max);
return 0;
}

也可以设数组用循环,这里四个数就不搞这些了。

T5 字符处理

类别:流程控制
时间限制:1S

内存限制:1000Kb

问题描述
从键盘输入一个字符,若为小写字母,则输出其对应的大写字母;若为大写字母,则输出对应的小写字母;其他字符原样输出。

输入说明
输入一个字符

输出说明
输出一个字符

输入样例
样例1输入
a
样例2输入
B
样例3输入
2

输出样例
样例1输出
A
样例2输出
b
样例3输出
2

本题小解析

其实这题就两个点:

1.判断这个字母是大写字母还是小写字母还是其他字符,用ASCII码控制。

2.对大小写字符进行操作(+或-32)。

弱鸡代码

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(){
char a;
scanf("%c",&a);
if(a>='a'&&a<='z')a-=32;
else if(a>='A'&&a<='Z')a+=32;
printf("%c",a);
return 0;
}

鉴于本人懒得查表看各位字符的ASCII码了,直接用字符代替。

T6 成绩分级

类别:流程控制
时间限制:1S

内存限制:1000Kb

问题描述
给出一个百分制的成绩,要求输出成绩等级’A’,’B’,’C’,’D’,’E’。90分以上为’A’,8089分为’B’,7079分为’C’,60~69分为’D’,60分以下为’E’。

输入说明
输入一个正整数m(0<=m<=100)

输出说明
输出一个字符

输入样例
59

输出样例
E

本题小解析

一个可以用if…else…或者switch…case…的案例。

由于成绩是10分一等位,故可以/10来进行转化并用swtich…case…语句。

弱鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(){
int m;
scanf("%d",&m);
m/=10;
switch(m){
case 10:case 9:printf("A");break;
case 8:printf("B");break;
case 7:printf("C");break;
case 6:printf("D");break;
default:printf("E");break;
}
return 0;
}

由于题目数据范围为0-100,在除去ABCD等第后,剩下的都为E等第,故用default代替。

T7 直角三角形

类别:流程控制

时间限制:1S

内存限制:1000Kb

问题描述
设直角三角形两条直角边长度为a和b,斜边长度为c,则a,b,c满足a^2+b^2=c^2,
输入三个整数a,b,c,判断对应的三角形是不是直角三角形,不是则输出“no”,是则输出其面积的2倍。

输入说明
数据由同一行的三个整数a,b,c构成,整数之间以空格分隔

输出说明
如果输入的三个整数可以构成一个直角三角形,则输出一个整数表示该三角形面积的2倍;否则输出“no”

输入样例
样例1输入
1 1 2
样例2输入
3 4 5

输出样例
样例1输出
no
样例2输出
12

本题小解析

本题主要是注意直角三角形的判断三角形公式的运算

在给定三角形三条边a,b,c的时候,有S=sqrt(p(p-a)(p-b)(p-c)),p=(a+b+c)/2,称为海伦公式

若a,b,c满足a^2+b^2=c^2,必存在以a,b,c为三边的三角形。同时要注意a,b,c都为最长边的情况。

如果使用sqrt函数,要包含<math.h>头文件

注意输出要求,两倍的面积或no。

弱鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <math.h>
int main(){
int a,b,c,area;
float p;
scanf("%d %d %d",&a,&b,&c);
p=(a+b+c)/2;
area=sqrt(p*(p-a)*(p-b)*(p-c));
if(a*a+b*b==c*c||b*b+c*c==a*a||c*c+a*a==b*b)printf("%d",area*2);
else printf("no");
return 0;
}

T8 工资计算

问题描述

小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资为S元,则他应交的个人所得税按如下公式计算:

  1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元;

  2) A中不超过1500元的部分,税率3%;

  3) A中超过1500元未超过4500元的部分,税率10%;

  4) A中超过4500元未超过9000元的部分,税率20%;

  5) A中超过9000元未超过35000元的部分,税率25%;

  6) A中超过35000元的部分,税率30%;

  例如,如果小明的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,超过4500元部分应缴税(6500-4500)×20%=400元。总共缴税745元,税后所得为9255元。

  已知小明这个月税前所得为S元,请问他的税后工资T是多少元。

输入格式

  输入为一个整数S,表示小明的税前工资。

输出格式

  输出一个整数T,表示小明的税后工资。

样例输入

10000

样例输出

9255

评测用例规模与约定

对于所有评测用例,1 ≤ T ≤ 100000。

所有评测数据保证小明的税前工资为一个整百的数。

本题小解析

一个经典的判断题,就是有点老了,个税改革啦!

注意个人起征点分段计算原则

注意输出为税后工资而不是个人所得税

弱鸡代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(){
int s,a,t;
scanf("%d",&s);
a=s-3500;
if(a<=0)t=0;
else if(a>0&&a<=1500)t=0.03*a;
else if(a>1500&&a<=4500)t=0.1*(a-1500)+45;
else if(a>4500&&a<=9000)t=0.2*(a-4500)+345;
else if(a>9000&&a<=35000)t=0.25*(a-9000)+1245;
else if(a>=35000)t=0.3*(a-35000)+7745;
s-=t;
printf("%d",s);
}