【第一轮/机考复习】基础+进制转换

写在前面


在准备机考补天的过程中记录所得
第一轮在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.数组使用技巧

  1. 存储数据
  2. 记录每个int值出现的次数,实现hash
  3. 标记位:记录每个下标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进制

  1. 核心过程和思路是x转10再由10转Y,则把上面两个模板顺序套用即可
  2. 在做题是最好对x和Y关于10进行大小比较,若有一方已经为10,则会简化程序。

三.AC踩坑与总结


1.总结

  1. 进制转换考核的本质就是对数位进行拆解和合并
  2. 数位拆解的核心步骤就是取余和整除
  3. 数位合并的核心步骤就是按权累加

2.AC踩雷

1.对一个整数进行浮点乘法运算使用%lf输出结果一直是0,应该用%g输出。

猜你喜欢

转载自blog.csdn.net/kodoshinichi/article/details/107410511