网易游戏2011.10.15校园招聘笔试题

来源:互联网 发布:java await notifyall 编辑:程序博客网 时间:2024/05/22 14:47

1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少。

页面大小是8KB,那么页内偏移量是从0x0000(0)~ 0x1FFF(2的13次方 - 1)。0x5F123/8K=2E,余数是1123;则页号是47页,页内偏移量应该是0X00001123。

2、如果X大于0并小于65536,用移位法计算X乘以255的值为: (X<<8)-X

X<<8-X是不对的,因为移位运算符的优先级没有减号的优先级高,首先计算8-X为0,X左移0位还是8。

3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有 3n+1 个空指针。

4、以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0

int *p1 = new int[10];int *p2 = new int[10]();

5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:0X12 小端模式:0X56 X86结构的计算机使用 小端 模式。

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。

6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:

int (fun)(int )

7、下面程序运行后的结果为:to test something

char str[] = "glad to test something";char *p = str;p++;  //字符占一个字节p++后p指向lint *p1 = static_cast<int *>(p);p1++;  //整型占四个字节p1++后指向tp = static_cast<char *>(p1);printf("result is %s\n",p);

8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:

(1)恰好第K次(1=

#include <iostream>using namespace std;const int lmax=10000;int c1[lmax+1],c2[lmax+1];int main(void){    int m,n,i,j,k,a[110];    //计算的方法还是模拟手动运算,一个括号一个括号的计算,从前往后    while (cin>>m && m)    {        n=0;        for(i = 0; i < m; i++)        {            scanf("%d",&a[i]);            n += a[i];        }        n += 5;     //有可能无法表示的那个数比所有纸币面额的总和还要大        for(i = 0; i <= n; i++)        {            c1[i] = 0;            c2[i] = 0;        }        for(i = 0; i < 2*a[0]; i += a[0])        //母函数的表达式中第一个括号内的各项系数            c1[i] = 1;        //第一层循环是一共有 n 个小括号,而刚才已经算过一个了,所以是从2 到 n         // i 就是代表的母函数中第几个大括号中的表达式        for(i = 2; i <= m; i++)        {            for(j = 0; j <= n; j++)              //j 就是指的已经计算出的各项的系数            {                for (k = 0; k < 2*a[i-1]; k += a[i-1])      //k 就是指将要计算的那个括号中的项                {                     c2[j+k] += c1[j];        //合并同类项,他们的系数要加在一起,所以是加法                }            }            for(j = 0; j <= n; j++)    // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项            {                c1[j] = c2[j];                c2[j] = 0;            }        }        for(i = 1; i <= n; i++)        {            if(c1[i] == 0)            {                cout<<i<<endl;      //找出第一个无法表示的纸币面额                break;            }        }    }    return 0;}

分析过程:
设N表示面额数量,v[i]表示第i个纸币的面额,其中i=1,…,N。
设s[i]=v[1]+…+v[i],则s[i]表示前i个纸币面额的总和。
要解决下面这个问题:
如果所有小于等于s[i]的正整数都能表示,那么所有小于等于s[i+1]的正整数在什么情况下也能全部表示?
充要条件是s[i]+1>=v[i+1]。
必要性:
首先如果s[i]+1

int _tmain(int argc, _TCHAR* argv[]){    const int MAX = 100;    int a[MAX];    int m = 0;    while (cin >> m && m)    {        for(int i = 0; i < m; i++)        {            std::cin >> a[i];        }        for (int i = 0, s = 0; i < m; i++)        {            if (s + 1 < a[i])            {                std::cout << s + 1 << std::endl;                break;            }            s += a[i];        }    }    return 0;}

转自:http://www.cnblogs.com/sooner/archive/2013/08/24/3280115.html

0 0
原创粉丝点击