能杀到榜一的不是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 d

a、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 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注