【刷题笔记】二维数组地址计算+算法分析+进制转换
目录
一、二维数组地址计算
题目:
分析:
解答:
二、算法分析举例
题目:
分析:
解答:
三、进制转换
题目:
分析:
解答:
一、二维数组地址计算
题目:
二维数组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;
}