能杀到榜一的不是23级的学弟学妹,而是21级的老人
——麦克·阿瑟
最近我们学校期中机试结束了,公布了重现赛,然后我直接大概1h杀完了,所以来写个题解罢
⬇️这里是所有的题,链接在点我!

A.ASCII码
题目描述:
输入一个字符,请输出其ASCII码。
输入:
输入一个字符
输出:
与输入字符相对应,输出其ASCII码(10进制)
样例输入:
0
样例输出:
The ASCII value is 48
作为A题当然是送分的,这边复习一下ASCII码相关知识:
ASCII码是American Standard Code for Information Interchange的缩写(美国标准信息交换代码),已被国际标准化组织ISO采纳,作为国际通用的信息交换标准代码。简单来说就是用数字(二进制十进制十六进制等)代表符号(包括空格、英文字母、阿拉伯数字字符、标点符号、各种运算符号和控制命令符号等等)
关于为什么要用数字表示字符可以了解一波计算机组成原理,这边我只说怎么做题(

通过这个表可以发现小写字母的ASCII码值比他对应的大写字母的ASCII码值大32,所以当你想转换大小写的时候可以char low = up + 32就可以让low成为up的小写字母。是个小技巧
言归正传来写A题,这里直接强制类型转换,把char类型转换成int类型就可以了
参考代码:
#include<iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
cout << "The ASCII value is " << (int)ch;
return 0;
}
B.等腰三角形
题目描述:
给定三角形的两个内角,判断其是否为等腰三角形。
输入:
输入空格分开的两个正整数α和β,表示三角形的两个内角度数。
输出:
如果三角形为等腰三角形,则输出”YES”,否则输出”NO”。
样例输入:
50 80
样例输出:
YES
依旧送分的题,根据题目意思去模拟,一个三角形知道两个角,那么第三个角就是用180°-α-β,再判断这三个角里面有没有哪两个角是相等的就可以了
参考代码:
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
int c = 180-a-b;
if(a == b|| a == c|| b == c){
cout << "YES";
}else{
cout << "NO";
}
return 0;
}
C.奋斗目标
题目描述:
经过半个学期的学习,有很多同学开始爱上程序设计,为此,特向各位同学推荐四个级别的目标:
一级目标是HNUSTCPC,HNUSTCPC是湖南科技大学大学生程序设计竞赛的英文缩写;
二级目标是HNCPC,HNCPC是湖南省大学生程序设计竞赛的英文缩写;
三级目标是CCPC,CCPC是中国大学生程序设计竞赛的英文缩写;
四级目标是ICPC,ICPC是国际大学生程序设计竞赛的英文缩写;
输入:
输入一个数字,如果数字的取值是1、2、3或4,表示想参加程序设计竞赛的最高目标。如果是其它数字,则表示只想通过课程考试。
输出:
与输入的最高目标相对应,输出将可能参加的最高目标赛事。如果输入的是1、2、3或4,则输出对应赛事的英文缩写。如果是其它数字,则输出“Pass the exam”。
样例输入:
4
样例输出:
ICPC
题目的意思很好理解:
- 输入1就输出HNUSTCPC
- 输入2就输出HNCPC
- 输入3就输出CCPC
- 输入4就输出ICPC
- 其他输入就输出Pass the exam
可以用switch做,也可以直接if
用switch的话注意写break,不然会把后面的case语句全部执行一遍
参考代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
switch (n) {
case 1:
cout << "HNUSTCPC";
break;
case 2:
cout << "HNCPC";
break;
case 3:
cout << "CCPC";
break;
case 4:
cout << "ICPC";
break;
default:cout <<"Pass the exam";
break;
}
return 0;
}
D.三角形的高
题目描述:
已知三角形的三条边a、b和c,求c边上的高,数据都是以厘米为单位。求三角形的面积可以使用海伦公式。
输入:
三个空格分开正整数a、b和c(0<a,b,c<=100),分别对应三角形三条边的长度。
输出:
输出c对应边上的高的长度,只输出该值的整数部分,注意不是四舍五入。如样例,c边上的高长度为2.4厘米,那么输出2即可。
样例输入:
3 4 5
样例输出:
2
也是根据题目意思去模拟,由三角形的三条边和海伦公式算出三角形面积,再用S=底*高/2就可以算出底边上的高了
这边注意在计算p和S的时候保持精度,使用浮点型float或者double,在算p的时候注意到分子和分母都是int类型,这样相除尽管p是double类型但他也只会有整数部分,没有小数部分,记住int/int还是int,所以采用double p = (a+b+c)*1.00/2这种形式可以让p保持精度
输出高要求向下取整输出整数,我们又可以利用这个特性
参考代码:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int a,b,c;
cin >> a >> b >> c;
double p = (a+b+c)*1.00/2;
double s = sqrt(p*(p-a)*(p-b)*(p-c));
int ans = 2*s/c;
//cout << s << endl;
cout << ans;
return 0;
}
E.时制转换
题目描述:
输入一个24小时制的时间,输出其12小时制的时间表示。
24小时制的时间表示范围为:00:00 ~ 23:59,没有24点的称呼。
12小时制的时间表示范围为:上午有:12:00 am ~ 12:59 am和01:00 am ~ 11:59 am,下午有:12:00 pm ~ 12:59 pm和01:00 pm ~ 11:59 pm,没有0点的称呼。
输入:
输入一个字符输入一个24小时制的时间。格式为“时:分”,如12时18分表示为”12:18“。若小时或分钟小于10时,需要带前导0,如8时8分表示为”08:08“,输出格式用“%02d”即可。
输出:
与输入相对应,输出其12小时制的时间表示。
样例输入:
20:18
样例输出:
08:18 pm
有点鬼的一个题,注意看题干的这句话:

因为12小时制没有0点的称呼,所以我们日常所说的0:00am在这个题这里要说成12:00am,也就是说题干里的12:00am~12:59am其实是在01:00am~11:59之前的
这边画个图易于理解一下

多看几眼,多理解一下这个弔题就读懂了
参考代码:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int hh,mm;
scanf("%d:%d",&hh,&mm);
if(hh == 0){
hh = 12;
printf("%02d:%02d am",hh,mm);
}else{
if(hh>13){
hh-=12;
printf("%02d:%02d pm",hh,mm);
}else if(hh == 12&&mm>=0){
printf("%02d:%02d pm",hh,mm);
}else{
printf("%02d:%02d am",hh,mm);
}
}
return 0;
}
F.奇偶标签化
题目描述:
有n个正整数,将其奇偶标签化。即奇数标记为1,偶数标记为0。
输入:
输入由两行组成。
第一行是一个大于1且小于100的整数n。
第二行是n个空格分开的正整数,整数值均不超过10000。
输出:
输出一行,格式如”[1,0,…0,1]”,括号中逗号隔开的0或1标记对应输入整数的奇偶。
样例输入:
6
1 2 3 4 5 6
样例输出:
[1,0,1,0,1,0]
判断数的奇偶,比上一个简单,不过输出的格式要小小的注意一下,可以看我是怎么输出的
细心的你看到我在判断一个数num是不是奇数时用了num&1,&的意思是“按位与”,类似的还有|:按位或、^:异或,他们的运算都是把num转化为二进制数再进行运算
- 按位与&:如2&3,转化为二进制:10(2)&11(2),那么按照“与的规则”:1与1才是1,其他都是0,得到的结果就是01(2),他的十进制就是1。那么如何利用&来判断是否是奇数呢?我们知道二进制的最右一位是代表2的0次方也就是1的,其他位都是2的n(n≥1)次方即都是2的倍数,所以这个数的二进制的最右一位是1就代表着这个数是奇数,那么这个数的二进制可以表示为xxxxx1,按位与1就是xxxxx1&1,只会与到最右一位,其他位都是0,自然结果就是1,1就代表真,代表是奇数了,否则就是xxxxx0&1,结果为0,代表否,代表不是奇数了
- 按位或|:“或的规则”:0或0才是0,其他都是1
- 异或^:“异或的规则”:1异或0,0异或1才是1,其他都是0举个例子:5^6:转化为二进制:101(2)^110(2),得到011(2),十进制就是3
参考代码:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,a[110];
cin >> n;
for(int i = 0;i<n;i++){
cin >> a[i];
if(i == 0){
if(a[i]&1){
cout << "[1";
}else{
cout << "[0";
}
}else{
if(a[i]&1){
cout << ",1";
}else{
cout << ",0";
}
}
}
cout << "]";
return 0;
}
G.反码
题目描述:
已知一个数用二进制表示的原码,求其反码并输出。关于反码,需要注意的是:正数的反码与原码相同,负数的反码是符号位保持不变而数值位按位取反。
输入:
输入一个数用二进制表示的原码,长度不超过8位。
输出:
与原码相对应,输出其用二进制表示的反码。反码的长度与原码相同。
样例输入:
11001010
样例输出:
10110101
第一位就可以判断正负,一个数的原码第一位是符号位,是0代表他是正数,是1代表他是负数,这是老早就学了的计算机导论的知识啊!!!!后续还会在计算机组成原理、汇编语言之类的课里面再学到!!!!!
要是不会读字符串可以采用%1d的方法逐个读入单个数字存入数组,然后再异或1即可取反,这边我会读字符串所以直接用字符串读了(还是得学学string嘞
不过不存数组,直接读一位输出一位也是可以的
参考代码:
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int main()
{
string s;
cin >> s;
if(s[0] == '0'){
cout << s;
}else{
cout << s[0];
for(int i = 1;i<s.size();i++){
if(s[i] == '0') cout << 1;
else cout << 0;
}
}
return 0;
}
H.数字三角形II
题目描述:
给定一个正整数n,输出相应的数字三角形。
输入:
一个正整数n, 2<=n<=9。
输出:
对应于n的数字三角形,第i行有i个i(1<=i<=n)。
样例输入:
5
样例输出:
1
22
333
4444
55555
考验写循环语句的基本功了,简单的找规律题:
一共n行,第一行有n-行数个空格,一直到最后一行没有空格,第一行有行数个数字,一直到最后一行全是数字
一些类似的输出数字三角形的题可以多做做,正着的倒着的顺着的反着的甚至输出棱形的
参考代码:
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n-i;j++){
cout << ' ';
}
for(int k = 1;k<=i;k++){
cout << i;
}
cout << endl;
}
return 0;
}
I.选手机号
题目描述:
某同学准备选一个手机号,对手机号码的要求是:号码中的尾数为66或88,且号码中没有数字4。手机号码为11位数字。
判断手机号码是否符合要求需要专门定义一个函数,函数首部定义为:int isLucky(long long phone);该函数返回值为1或0。请在下面代码的基础上,将函数定义的代码补充完整。#include<stdio.h> int isLucky(long long phone); int main(void) { long long phone; scanf("%lld",&phone); if(isLucky(phone)) printf("This is a lucky phone number\n"); else printf("This is not a lucky phone number\n"); return 0; } //下面编写函数定义的代码
输入:
输入一个11位数字构成的手机号码。注意,长度为11位的整数需要用long long类型的变量存储。
输出:
检查输入的手机号码,如果是符合要求的手机号码,输出”This is a lucky phone number”,否则输出”This is not a lucky phone number”
样例输入:
18607324688
样例输出:
This is not a lucky phone number
只需要你编写一个判断的函数,根据题意,满足3个条件的就是幸运手机号了:号码中的尾数为66或88,且号码中没有数字4。手机号码为11位数字。
可以采用不断地将phone = phone/10直到phone == 0来计算phone有多少位数,在此期间可以使用模运算把phone的每一位是什么数字求出来:int num = phone%10。
为什么可以求每一位呢,因为当你模过一次,得出phone的最后一位数后再把他/10,phone的最后一位就没了(还记得前面写D题的时候提到的int/int还是int吗),此时再模,得到的就是原本phone的倒数第二位,以此类推,就可以得到phone的每一位,这样就可以看phone是不是哪一位是4,也可以很简单的判断最后两位是不是66或者88
int isLucky(long long phone){
int length = 2;
int last1 = phone%10;
if(last1 == 4){
return 0;
}
phone/=10;
int last2 = phone%10;
if(last2 == 4){
return 0;
}
phone/=10;
//cout << last2 << last1 << endl;
if(last1 == last2&&(last1 == 6||last1 == 8)){
}else{
return 0;
}
while(phone){
if(phone%10 == 4){
return 0;
}
length++;
phone/=10;
}
//cout << length;
if(length == 11){
return 1;
}else{
return 0;
}
}
J.一元一次方程
题目描述:
写一个C程序求一元一次方程的根。方程的基本形式如下:
ax op1 b=cx op2 da、b、c、d均为大于1且不超过100的整数,其中a-c不等于0,op1和op2为‘+’或’-‘。等式的一侧最多两项,最少一项。等号两边的px op q也可能写成q op px。另外,方程中可能有空格。
下面是几个方程的例子:
2x+2=3x+3
2 x + 2 = 4 – 3 x
2-5x = 2
2=4x
4x=2
输入:
一个一元一次方程。其中30%的数据是ax=b的形式,不会做复杂的可以只按这种方式处理
输出:
输出如”x=root”的形式。根为整数直接输出,如果为分数则输出最简分数形式。
样例输入1
3x+2=2x+4
样例输出1
x=2
样例输入2
3-6x=6
样例输出2
x=-1/2
样例输入3
2=4x
样例输出3
x=1/2
样例输入:
3x+2=2x+4
样例输出:
x=2
重量级比较大的模拟题
考虑把问题简化成如果只有ax+b=cx+d的形式,只需要分别求出a,b,c,d就可以很简单的求出最终结果,但是输入的格式可能会有空格,可能会是b+ax=d+cx的形式,所以需要判断。
这边我把输入的字符串的空格全部去掉换成一个新串了:
string tool,s = {};
getline(cin, tool);
for(int i = 0;i<tool.size();i++){
if(tool[i]!=' '){
s += tool[i];
}
}
tool是读入的字符串,s是去掉了空格后的
关于将数字字符转换成数字,用int num = ch-'0'就可以了,但是题目说a,b,c,d是大于1且不超过100的整数,才不是一位数呢,所以算num时可以这样:
if(s[i]>='0'&&s[i]<='9'){
num*=10;
num+=s[i]-'0';
}
现在思考什么时候把num赋值给a,b,c,d,赋值的时候应该赋值给谁
- 当在处理“=”之前的字符串时,肯定是赋值给a和b;当在处理“=”之后的字符串时,肯定是赋值给c和d
- 在“=”之前时,当碰到“x”的时候,肯定赋值给a,当碰到“+”,“-”,“=”的时候,赋值给b,但是当碰到“=”且“=”前一个字符是“x”的时候就不处理b,因为肯定是b+ax=的形式,所以b已经在碰到“+“的时候被赋值了,这样避免重新赋值把正确的b搞没了
- 在“=”号之后,当碰到“x“的时候,肯定赋值给c,当碰到“+”,“-”的时候,赋值给d,但是注意=cx+d的形式,最后得出了d的值却不能给他赋值(因为没有判断条件了)所以在最后特别关注一下d,如果d没有值就把num赋值给他(是0也没关系)
- 当碰到“-”的时候注意下一次赋值给a,b,c,d的值应当是负数
那么就求出了a,b,c,d了,运用小学数学知识,x的值就是(d-b)/(a-c),这边可以看我的代码学学把分式约分
细心考虑下,做出来也不难
参考代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int gcd(int a,int b)
{
a = abs(a);
b = abs(b);
if(a < b) swap(a,b);
return b?gcd(b,a%b):a;
}
int main() {
string tool,s = {};
getline(cin, tool);
for(int i = 0;i<tool.size();i++){
if(tool[i]!=' '){
s += tool[i];
}
}
//cout << s << endl;
int a = 0,b = 0,equal = 0,c = 0,d = 0;
int num = 0;
int flag = 1;
for(int i = 0;i<s.size();i++){
if(equal == 0){
if(s[i]>='0'&&s[i]<='9'){
num*=10;
num+=s[i]-'0';
}else if(s[i] == 'x'){
a = num*flag;
num = 0;
flag = 1;
}else if(s[i] == '-'){
b = num*flag;
flag = -1;
num = 0;
}else if(s[i] == '+'){
b = num*flag;
num = 0;
flag = 1;
}else if(s[i] == '='){
equal = 1;
if(s[i-1]!='x'){
b = num*flag;
num = 0;
flag = 1;
}
}
}else{
if(s[i]>='0'&&s[i]<='9'){
num*=10;
num+=s[i]-'0';
}else if(s[i] == 'x'){
c = num*flag;
num = 0;
flag = 1;
}else if(s[i] == '-'){
d = num*flag;
flag = -1;
num = 0;
}else if(s[i] == '+'){
d = num*flag;
num = 0;
flag = 1;
}
}
}
if(!d){
d = num*flag;
}
//cout << a << 'x' << b << '=' << c << 'x' << d << endl;
int mom = a-c;
int son = d-b;
double x = son*1.00/mom;
//cout << x << (int)x;
if((int)x == x) {
if(x == 0){
cout << "x=0" << endl;
}else{
cout << "x=" << x << endl;
}
}else{
int chu = gcd(son,mom);
son/=chu;
mom/=chu;
if(son*mom>0){
cout << "x=" << abs(son) << "/" << abs(mom) << endl;
}else{
cout << "x=-" << abs(son) << "/" << abs(mom) << endl;
}
}
return 0;
}
这边庆幸下还好abcd都大于1,不然要是出个x=2,我的代码都不知道a=1,不过这种情况特判一下就可以了
总的来说这些题也不难的,除了最后一题会花的时间多点外,改时间那个题有点鬼外都很好做

0 条评论