【刷题笔记】二维数组地址计算+算法分析+进制转换

目录

一、二维数组地址计算

题目:

分析:

解答:

二、算法分析举例

题目:

分析:

解答:

三、进制转换

题目:

分析:

解答:


一、二维数组地址计算

题目:

        二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为?

分析:

        本题只是告知了二维数组两个位置的地址。需要知道另一个位置的地址,那么我们就需要根据行数和列数进行求解。

        思路1:对此,即然我们不知道具体的行号、列号以及起始位置,可以根据两个已知条件列出等式,求解二元一次方程组即可。

        但是,思路1没有充分利用题中给的条件:每个元素占1个存储单元,所以有优化方案思路2。

        思路2:我们可以根据两个已知条件简单的算出每个行占用的存储单元,即X[4][4]只需要加上5就可以得到X[4][9]了,而得到的位置和X[9][9]相差5行,地址相减就可以得到每个行占用的存储单元。然后X[7][7]不就是在X[4][4]的基础上增加了3行,在向右增加了3个存储单位,就可以得到答案了。

解答:

二、算法分析举例

题目:

        求函数返回值,输入x=9999。

int func(int x){
    int count=0;
    while (x)
    {
        count++;
        x=x&(x-1);//与运算
    }
    return count;
}

分析:

        在拿到一道程序输入题的时候,不可盲目带入运算。即然给了一段程序,那么它应该是完成某些功能进行设计的。我们不妨首先分析出此段程序的功能。(带入简单的例子进行分析)

        得到程序功能后,往往解答就简单了。

解答:

        针对于此程序,我们不妨带入7进去运算。既然涉及到位运算-7(111(2))。count肯定是一个计数器,我们需要得到其统计的是什么个数。

         可以发现,随着每一次循环原来二进制中的0会多一个,直到原数全为0.可以发现此算法就是统计当前数存在多少个1的。了解这点后,我们只需要对十进制数9999进行二进制展开查看1的个数即可。

        9999 = 10011100001111,一共有8个零,这也是函数的返回值。

三、进制转换

题目:

牛客网链接:进制转换_牛客题霸_牛客网

描述

        给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数

输入描述

        输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。

输出描述

        为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)

示例

输入:7 2
输出:111

分析:

        按照正常十进制转换其余进制数的方法来。除数取余法。需要注意每次取余保存,需要逆置以及针对负数情况。

        对于取余数保存的时候利用字符串,我们可以针对0~16写一个字符数组,这样就可以应对字符串拼接问题。

解答:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    int m, n;
    cin >> m >> n;
    string res, str = "0123456789ABCDEF";
    bool flag = false;
    if (m < 0){
        flag = true;
        m = -m;
    }
    do{
        res += str[m % n];
        m  /= n;
    }while(m);
    if (flag) res += "-";
    reverse(res.begin(), res.end());
    cout << res << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_61508423/article/details/130504601