我的答案与解析:
1. D 2. C 3. B 4. A 5. D 6. C 7. A
8. C
我们可以把12个鸡蛋分成三堆,每堆4个。首先,我们命名那三堆分别叫A、B、C。
一、 如果A=B,表示坏的鸡蛋在C里面,我们命名C里面的四个鸡蛋分别为c1、c2、c3、c4。所以,如果想找到坏的鸡蛋,即先从C挑出两个(称其为c1、c2)出来秤。
1. 若c1=c2,即表示坏的鸡蛋在c3或c4中。
1)这时再挑出其中一个(假设为c3)与A或者B中的任意一个鸡蛋秤。
如果等重,即表示c4是坏鸡蛋;
若不等重,即表示c3是坏鸡蛋。
2. 若c1不等于c2,即表示这两个鸡蛋有一个是坏的。
2)这时挑c1与A或者B中的任意一个鸡蛋秤。
如果等重,即表示c2是坏鸡蛋;
如果不等重,即表示c1是坏鸡蛋。
二、 如果A不等于B,即表示坏鸡蛋在A或者B中。所以,我们可以先将A分成两堆,再进行秤。如果等重,表示坏鸡蛋在B中。如果不等重,表示坏鸡蛋在A中。如果要在3次成功找到坏鸡蛋,此时只有一次可以测量的机会了,且不知道坏鸡蛋的轻重,故怎么分是个重要的课题。
首先,将A、B分别标号为a1、a2、a3、a4,及b1、b2、b3、b4。
再来,假设A>B(B>A情况一样)。
1. 故若a1+a2+b1>a3+a4+b2,则有两种可能。
1). a1+a2=a3+a4,而b1>b2,表示B含有坏鸡蛋且较轻,故b2是坏鸡蛋;
2). a1+a2>a3+a4,而b1=b2,表示A中含有坏鸡蛋,且坏鸡蛋较重,故a1或a2中其中一个是坏鸡蛋。
因此要将a1和a2秤重,若等重,即表示b2是坏鸡蛋。若不等重,则较重者为坏鸡蛋。
2. 若a1+a2+b1=a3+a4+b2,即表示坏鸡蛋在B中且较轻。如此就只剩下b3和b4。再将b3和b4秤重,看哪个轻,即为坏鸡蛋。
总之,秤重3次,第一次秤重A和B,当A与B不相等时,第二次秤重a1+a2+b1与a3+a4+b2,当a1+a2+b1与a3+a4+b2不相等时,第三次秤重a1与a2.
9. B 10. A 11.C 12.A 13.C 14.B 15.D 18.D 21.B
22.D
堆都是动态分配内存的,没有静态分配内存的;栈有两种分配内存方式,动态和静态。
23.C 24.A 25.C
26.C
#include <iostream> using namespace std; int foo(int& nParam) { nParam = 10; return -1; } int main() { int nTom = 0; const unsigned int uJerry = 10; nTom = foo(nTom); while (nTom < uJerry) { nTom++; } if (nTom > uJerry) { nTom = 100; } if (nTom == uJerry) { nTom = 200; } cout<<nTom<<endl; // 100 system("pause"); return 0; }
27.A
#include <iostream> using namespace std; class Base { public: Base() { printf("Base Ctor."); foo(); } ~Base() { printf("Base Dtor."); foo(); } virtual void foo() { printf("foo Base."); } }; class Derived : public Base { public: Derived() { printf("Derived Ctor."); foo(); } ~Derived() { printf("Derived Dtor."); foo(); } virtual void foo() { printf("foo Derived."); } }; int main() { Base *p = new Derived(); delete p; printf("\n"); system("pause"); return 0; } // Base Ctor.foo Base.Derived Ctor.foo Derived.Base Dtor.foo Base.因为有delete操作,所以会调用析构函数;又因为析构函数不是虚函数,所以只调用基类的析构函数。
28.C 29.C
30.C
#include <iostream> using namespace std; unsigned short hash1(unsigned short key) { return (key << 8 >> 8) % 256; } int main() { unsigned short a = 16; unsigned short b = 256; cout<<hash1(a)<<endl; // 16 cout<<hash1(b)<<endl; // 0 system("pause"); return 0; }
31.B
地址总线决定逻辑内存大小;
32.D
33.A
http://lakebroad.blogbus.com/logs/2218104.html
fork系统调用产生一个新的进程, 叫子进程, 是调用进程的一个复制品. 调用进程叫父进程, 子进程继承了父进程的几乎所有的属性:
. 实际UID,GID和有效UID,GID.
. 环境变量.
. 附加GID.
. 调用exec()时的关闭标志.
. UID设置模式比特位.
. GID设置模式比特位.
. 进程组号.
. 会话ID.
. 控制终端.
. 当前工作目录.
. 根目录.
. 文件创建掩码UMASK.
. 文件长度限制ULIMIT.
. 预定值, 如优先级和任何其他的进程预定参数, 根据种类不同决定是否可以继承.
. 还有一些其它属性.
但子进程也有与父进程不同的属性:
. 进程号, 子进程号不同与任何一个活动的进程组号.
. 父进程号.
. 子进程继承父进程的文件描述符或流时, 具有自己的一个拷贝并且与父进程和其它子进程共享该资源.
. 子进程的用户时间和系统时间被初始化为0.
. 子进程的超时时钟设置为0.
. 子进程不继承父进程的记录锁.
. pending signals 也不会被继承。
linux下fork的实现是copy-on-write,也就是子进程与父进程初始时只有页表和task structure不同。
34.C
当第一个fork返回父进程号的时候,后面那个fork会执行;当第一个fork返回子进程号的时候,后面那个fork不会执行。
35.没有正确答案,应该是6次缺页。 36.B 37.A 38.C 39.B 40.C 41.A 42.B 43.C 44.D 45.A