写在前面
在准备机考补天的过程中记录所得
第一轮在B站上刷到了N诺,所以第一轮全是通过N诺的机试攻略来复习的。(不是广告,基础差友好型)
http://noobdream.com/Major/majorinfo/4/
一.机试的基础知识
1.头文件
//万用模板
#include<bits/stdc++.h>
using namespace std;
/*一般情况下用上面两行可以覆盖大部分需要使用的库*/
//可能用到的头文件
#include<stdio.h>
//上述等价写法#include<cstdio>
//以下不再赘述
#include<cstring>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
2.数组使用技巧
- 存储数据
- 记录每个int值出现的次数,实现hash
- 标记位:记录每个下标id出现最早/晚/大/小的值
3.数值范围
int | -1e9~1e9 |
---|---|
long long | -1e18~1e18 |
二.进制转换问题
进制转换问题只要掌握了模板,就可以解决这部分题目
考点1:整数反序
//输入:一个若干位的整数
//输出:逆序的一个整数
int a;
cin>>a;
int res = 0;
while(a>0){
res *= 10;
res += a%10;
a = a/10;
}
考点2:十进制转X进制
//该版本为通用型,x大于或小于10对应的处理会有不同
//输入:一个十进制整数
//输出:x进制的数字串
int a;
cin>>a;
const int maxn = 100;//根据题意来定
char s[maxn];
int cnt = 0;
while(a>0){
int v = a%x;
n = n / x;
if(v<10){
s[cnt++] = v + '0';
}
else
s[cnt++] = v-10+'A';//题目会说明是大写还是小写或是不敏感
}
for(int i = 0;i<strlen(s);i++)
cout<<s[i];
cout<<endl;//要看清题目对于末尾有无空格和换行的要求
x小于10:使用int []即可,不需要判断,直接存入
x大于10:跟通用模板一致,因为x大于10,但是求模运算得到的值既可能小于10也可能大于10
考点3:X进制转十进制
//输入:x进制串
//输出:十进制整数
//该版本也是通用版本,特别情况是转二进制
const int maxn = 100;
char s[maxn];
int res = 0;
cin>>s;
for(int i = 0;i<strlen(s);i++){
if(s[i]>='0'&&s[i]<='9')
res = res * x + s[i]-'0';
else
res = res * x + s[i]-'A'+10;//这里同样要注意字母大小写问题
}
cout<<res<<endl;
考点4:X进制转Y进制
- 核心过程和思路是x转10再由10转Y,则把上面两个模板顺序套用即可
- 在做题是最好对x和Y关于10进行大小比较,若有一方已经为10,则会简化程序。
三.AC踩坑与总结
1.总结
- 进制转换考核的本质就是对数位进行拆解和合并
- 数位拆解的核心步骤就是取余和整除
- 数位合并的核心步骤就是按权累加
2.AC踩雷
1.对一个整数进行浮点乘法运算使用%lf输出结果一直是0,应该用%g输出。