1 对于一个内存地址是32位、内存页是8KB的系统。0x0005F123这个地址的页号与页内偏移分别是多少?
页号为:0x0005F123 >> 13位 = 0x2E页内偏移为原地址的低13位:0x1123。
2 如果X大于0并小于65536,用移位法计算X乘以255的值? (x<<8)-x; //移位运算符的优先级小于减号运算符,因此要加括号
3一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有多少个空指针?(3n+1)
4以下两个语句的区别是:
[cpp]view plain copyint*p1=newint[10]; int*p2=newint[10](); 第一个没有初始化,第二个会调用构造函数初始化,即数组元素都为0.
5计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:0x12; 小端模式:0x56.
PS:该题不够严谨,大端模式为0x00.
6请声明一个参数为int *,返回值为int的函数指针:int (*func)(int *);
7下面程序运行后的结果为:to test something //p1++时移动了4个字节
[cpp]view plain copycharstr[]="gladtotestsomething"; char*p=str; p++; int*p1=static_cast<int*>(p); p1++; p=static_cast<char*>(p1); printf("resultis%s\n",p);
8 你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:数学题
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少?1/n
(2)平均需要尝试多少次?(n+1)/2
9头文件中ifndef / define / endif 是做什么用的?
都是预编译命令,作用是防止该头文件被重复引用,避免变量、类型等被重新定义。
10代码里有时可以看到extern “C”,这语句是做什么用的?
本质作用是:实现C和C++的混合编程。原理是C++和C编译全局变量和函数的实现方式不同。实际用法有两个:
1)在C++中调用C语言写的函数。2)C程序调用C++编写的函数。
11在下列乘法算式中,每个字母代表0~9的一个数字,而且不同的字母代表不同的数字:写出推导的过程。
ABCDEFGH
* AJ
------------------
EJAHFDGKC
BDFHAJEC
------------------
CCCCCCCCC
大致过程是:首先通过观察可得K=0,然后通过AB * A = BD,AB * J = EJ,可推测A = 2,E=1, B=4,之后就简单了。
答案是:A=2、B=4、C=6、D=9、E=1、F=3、G=5、H=8、J=7、K=0
参考来源: /hackbuteer1/article/details/6878570
/xulei/archive//11/12/558139.html
1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少。
页面大小是8KB,那么页内偏移量是从0x0000(0)~ 0x1FFF(2的13次方 - 1)。0x5F123的页号是0x2E (48)页,页内偏移量是0x1104。
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
[cpp]view plain copyint*p1=newint[10]; int*p2=newint[10]();
5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式:0X12 小端模式:0X56 X86结构的计算机使用小端模式。
一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。
6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:
int (*fun)(int *)
7、下面程序运行后的结果为:to test something
[cpp]view plain copycharstr[]="gladtotestsomething"; char*p=str; p++; int*p1=static_cast<int*>(p); p1++; p=static_cast<char*>(p1); printf("resultis%s\n",p);
8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。(1-1/n)*(1-1/(n-1))*(1-1/(n-2))***(1/(n-k+1)) = 1/n
(2)平均需要尝试多少次。
这个就是求期望值 由于每次打开宝箱的概率都是1/n,则期望值为: 1*(1/n)+2*(1/n)+3*(1/n)+......+n*(1/n) = (n+1)/2
9、头文件中ifndef / define / endif 是做什么用的?
10、代码里有时可以看到extern “C”,这语句是做什么用的?
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
12、输入格式:第一行输入N(N<=100)表示流通的纸币面额数量;第二行N个纸币的具体表示的面额,从小到大排列,取值【1,10^6】。
输出格式:输出一个整数,表示应该发行的纸币面额,这个整数是已经发行的所有纸币面额都无法表示的最小整数。(已经发行的每个纸币面额最多只能使用一次)
思路:这是一个典型的母函数问题,一般的典型母函数如 G(x)= (1+x+x^2+x^3+x^4+x^5+....)*(1+x^2+x^4+x^6+x^8+x^10+....)*(1+x^3+x^6+x^9+x^12....).....
这个题目中的每个纸币只能够使用0次或1次,在上面的那个一般的母函数的基础上修改一下就行了,就很简单了。。
具体代码如下:
[cpp]view plain copy#include<iostream> usingnamespacestd; constintlmax=10000; intc1[lmax+1],c2[lmax+1]; intmain(void) { intm,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; } } } return0; }
待续 。。。