本帖最后由 MichealGeng 于 2015-4-20 13:08 编辑
背景
小伙伴参加了企鹅厂的2015校招笔试,有五道大题,拿出三道算法类的题尝试着实现实现。这是第二道题:计算整形长度
其中第一题:抽奖算法实现可以看这里
题目
第二题题目大意是:*在不使用sizeof()函数的情况下,取出本机的整形所占位数,如32位、64位等*。
分析
在计算机中,常用的基本类型为:char、short int、long int、float、double。所以本体的巧妙之处在于,你不知道这个整形到底是长整形还是短整型。
因此,不同的操作系统整形所占的位数长度是不同的。在常见的Windows操作系统中,int型其实是short int型;在其他的系统中则并不一定。但是在所有计算机中字符型(char)均占用一个字节,其他类型都比int型长(或相等),因此这道题需要通过char类型来确定int型所占位数。
具体设计思路如下:
- 申请一个整形变量并对其赋值
- 申请一个字符型数组,将字符型数组的首地址指向上面申请的整形变量
- 申请一个新的字符型数组和新的整形变量,并用新的数组首地址指向新的整型变量,将上面的字符型数组从头开始每一个元素对新的字符型数组进行赋值,赋值完后,比较两个整形是否相等,若想等则观察两个数组一共有几个元素相等,借此判断出整形占用几个字节
- 将字节转化为位数
源代码
[C] 纯文本查看 复制代码 #include<stdio.h>
int calculate(); // 判断整形所占字节数
int main()
{
// 输出整形所占位数,其中位数=字节数×8
printf("本台计算机整形所占位数为:%d\n", calculate() * 8);
return 0;
}
int calculate()
{
int ori; // 用于存放原整形
// C语言中整形申请不赋值会自动分配一个随机负数
int ret = 0; // 存放新数据
// 防止随机分配的某些字节与ori相同,对其赋0
char *orig = (char *)&ori; // 用于存放原数据
char *retu = (char *)&ret; // 用于存放新数据
//orig = (char *)&ori; // 将原整形地址赋值给orig数组首地址
//retu = (char *)&ret; // 将新整形地址赋值给retu数组首地址
for (int num=0; num<8; num++) // 由计算机组成原理知,int不会大于8个字节
{
retu[num] = orig[num]; // 逐次赋值
/*
整型变量地址和数组的首地址相同,
若两整形值相同,
则说明在数组从零开始到整形所占字节数处,每个元素只都相同。
这里只需要取到第一次相同的值即可表明整形所占字节数
*/
if (ori == ret)
return ++num; // 返回整形所占字节数
}
return -1;
}
总结
企鹅厂这道题出的水准不错,考察了微机原理、计算机组成、数据结构、C语言编码等多方面能力。如果这道题将取整形所占位数改为取一个字符串所占位数的话,难度会降低一个档次。这里考察了求职者是否对微机原理和计算机组成方面相关的基本类型是否掌握;是否知道整形是基本类型中唯一一个长度不确定的类型,以及其他类型所占的长度。
另外在设计算法的时候,对C语言编码以及数据结构也做了考察,总的来说,我很喜欢这道题……不过很可惜,没有参加这个笔试。
|