在机试中,我们经常会面对这样一类问题,它们并不涉及很深奥的算法和数据结构,而只与数理逻辑相关,将这类题目称为数学问题。
这类问题通常不需要用到特别高深的数学知识,而只需要掌握简单的数理逻辑知识。本文重点记录机试中常常涉及的一系列数学问题,以便很好地掌握计算机考研机试中涉及的数学问题的求解。
一、进制转换
三种题型:
1. 十进制转N进制(10 --> N)
2. M进制转10进制(M --> 10)
3. M进制转N进制(M --> N)
1、二进制数–北京邮电大学
描述:
大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0。
输入描述:
多行,每一行表示要求的数字
输出描述:
输出共T行。每行输出求得的二进制串。
示例1:
输入:
23
535
2624
56275
989835
输出:
10111
1000010111
101001000000
1101101111010011
11110001101010001011
题解:
分析:
十进制正数转二进制,使用"除2取余法"即可。
我们使用一个数组来存放 num % 2 的值,然后再将num / 2,以此循环,直至num为0。
最后逆序输出数组即可。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
/**
* 将整数转划为二进制
* @param num
*/
void convertToBinary(int num);
/**
* 二进制数--北京邮电大学
* @return
*/
int main() {
int num;
while (cin >> num) {
convertToBinary(num);
}
return 0;
}
void convertToBinary(int num) {
vector<int> countVector;
if (num == 0) {
//特殊情况,num为0
countVector.push_back(0);
} else {
while (num != 0) {
countVector.push_back(num % 2);
//右移1位相当于除2
num = num >> 1;
}
}
/*
* 逆序输出
*/
for (int i = countVector.size() - 1; i >= 0; --i) {
cout << countVector[i];
}
cout << endl;
}
2、八进制–华中科技大学
描述:
输入一个整数,将其转换成八进制数输出。
输入描述:
输入包括一个整数N(0<=N<=100000)。
输出描述:
可能有多组测试数据,对于每组数据, 输出N的八进制表示数。
示例1
输入:
7
8
9
输出:
7
10
11
题解:
分析:
十进制正数转八进制,使用"除8取余法"即可。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
/**
* 将十进制整数转化为n进制
* @param num
* @param n
*/
void convertTen2N(int num, int n);
/**
* 八进制数--华中科技大学
* @return
*/
int main() {
int num;
while (cin >> num) {
//转八进制
convertTen2N(num, 8);
}
return 0;
}
void convertTen2N(int num, int n) {
vector<int> countVector;
if (num == 0) {
//特殊情况,num为0
countVector.push_back(0);
} else {
while (num != 0) {
countVector.push_back(num % n);
num /= n;
}
}
/*
* 逆序输出
*/
for (int i = countVector.size() - 1; i >= 0; --i) {
cout << countVector[i];
}
cout << endl;
}
3、进制转换–北京大学
描述:
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串(注意可能存在的一个测试用例里的多组数据)。
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
示例1
输入:
0xA
输出:
10
题解:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
/**
* char转int
* @param target
* @return
*/
int char2Int(char target);
/**
* 将m进制的num转化为十进制
* @param num
* @param m
*/
void convertM2Ten(string num, int m);
/**
* 进制转换--北京大学
* @return
*/
int main() {
string hexNum;
while (cin >> hexNum) {
hexNum = hexNum.substr(2);
//16进制转10进制
convertM2Ten(hexNum, 16);
}
return 0;
}
int char2Int(char target) {
if ('0' <= target && target <= '9') {
//0~9直接减去字符0即可
return target - '0';
} else {
//大于等于10,则先减去字符A(注意题目是大写还是小写),再加上10
return target - 'A' + 10;
}
}
void convertM2Ten(string num, int m) {
int number = 0;
/*
* 解法1
*/
for (int i = 0; i < num.size(); ++i) {
number *= m;
number += char2Int(num[i]);
}
/*
* 解法2:利用基数乘以权重
*/
// int x = 1;
// for (int i = num.size() - 1; i >= 0; --i) {
// number += char2Int(num[i]) * x;
// x *= m;
// }
cout << number << endl;
}
4、进制转换2–清华大学
描述:
将M进制的数X转换为N进制的数输出。
输入描述:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出描述:
输出X的N进制表示的数。
示例1
输入:
10 2
11
输出:
1011
备注:
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
题解:
分析:
上面的题都懂了之后,综合起来就是本题的解法了。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
/**
* char转int
* @param target
* @return
*/
int char2Int(char target);
/**
* int转char
* @param target
* @return
*/
char int2Char(int target);
/**
* 将m进制的num转化为十进制
* @param num
* @param m
*/
long long convertM2Ten(string num, int m);
/**
* 将十进制的num转化为n进制
* @param num
* @param n
*/
void convertTen2N(long long num, int n);
/**
* 进制转换2--清华大学
* @return
*/
int main() {
int m, n;
while (cin >> m >> n) {
string num;
cin >> num;
long long number = convertM2Ten(num, m);
convertTen2N(number, n);
}
return 0;
}
long long convertM2Ten(string num, int m) {
long long number = 0;
for (int i = 0; i < num.size(); ++i) {
number *= m;
number += char2Int(num[i]);
}
return number;
}
void convertTen2N(long long num, int n) {
vector<char> ans;
if (num == 0) {
//特殊情况
ans.push_back('0');
} else {
while (num != 0) {
ans

最低0.47元/天 解锁文章
395

被折叠的 条评论
为什么被折叠?



