您的位置:首页 > 其它

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

2012-08-20 15:16 323 查看
1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少。
内存地址=内存页号+页内偏移。共32位。内存是8KB==》页内偏移是13位,剩余19位是页号。
页号=0X2F=27,页内偏移=0X1123


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

答:(X<<8)-1,必须有括号,因为移位运算符的优先级没有减号的优先级高


3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有()个空指针。
答:3n+1。n个结点共有4n个指针,树只有n-1条边,所以只有n-1条边是使用的。


4、以下两个语句的区别是:
int *p1 = new int[10];  
int *p2 = new int[10]();
答:1:开辟了一个int型的数组,数组大小为10,值为随机,用p1指向这个数组
2:开辟了一个int型的数组,数组大小为10,值为0,用p2指向这个数组


5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式() 小端模式(),X86结构的计算机使用()模式。
答:0X12,0X56,小端
一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。


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

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

char str[] = "glad to test something";  
    char *p = str;  
    p++;  
    int *p1 = static_cast<int *>(p);  
    p1++;  
    p = static_cast<char *>(p1);  
    printf("result is %s\n",p);
答:
to test something
 p=str[0] -----> p=str[1] -----> p=str[5]


8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。
(2)平均需要尝试多少次。
答:(1)1/n。每一次成功的概论都是相等的
(2)(n+1)/2


9、头文件中ifndef / define / endif 是做什么用的?
#ifndef //....如果未定义 什么什么 
#define //....则定义 什么什么 
#endif //结束语句
可以用来预防多重包含同一头文件


10、代码里有时可以看到extern “C”,这语句是做什么用的?

4-16笔试

11、在下列乘法算式中,每个字母代表0~9的一个数字,而且不同的字母代表不同的数字:

ABCDEFGH
* AJ
------------------
EJAHFDGKC
BDFHAJEC
------------------
CCCCCCCCC
请写出推导的过程。
答:唯一解:A=2、B=4、C=6、D=9、E=1、F=3、G=5、H=8、J=7、K=0
A*A=B先推出A=2


12、输入格式:第一行输入N(N<=100)表示流通的纸币面额数量;第二行N个纸币的具体表示的面额,从小到大排列,取值【1,10^6】。

输出格式:输出一个整数,表示应该发行的纸币面额,这个整数是已经发行的所有纸币面额都无法表示的最小整数。(已经发行的每个纸币面额最多只能使用一次)

输入
输出
5
1 2 3 9 100
7
5
1 2 4 9 100
8
5
1 2 4 7 100
15
答:见普通母函数

#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;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: