机试_4_数学问题

在机试中,我们经常会面对这样一类问题,它们并不涉及很深奥的算法和数据结构,而只与数理逻辑相关,将这类题目称为数学问题。

这类问题通常不需要用到特别高深的数学知识,而只需要掌握简单的数理逻辑知识。本文重点记录机试中常常涉及的一系列数学问题,以便很好地掌握计算机考研机试中涉及的数学问题的求解。

一、进制转换

三种题型:
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值