1、虚函数的实现机制。
虚函数发生在继承当中,子类与父类之间可以有不同的方法,或者同一个方法名有不同的实现,从而体现了类的多态性质。具体实现是通过一个虚函数表,可以通过类对象的地址找到虚函数表的地址,虚函数表中保存的是类方法的地址,如果子类与父类的函数名不一样,那么子类方法放在虚函数表前面,父类方法放在虚函数表后面。如果子类方法有个父类方法同名的,那么子类方法将覆盖父类方面在虚函数中的位置。
2、static关键字的作用。
- 被static修饰的变量,它的声明周期直到整个程序结束,被分配到静态存储区。
- 可以被模块内的其它函数使用,可以看作是一个全局变量。
- 被声明为static的函数只能被模块内的其它函数调用。
const表示修饰的成分是一个值不可改变的变量,可以理解为只读类型。
4、n!末尾所包含零的个数。
5!=120,末尾一个0,10阶乘末尾2个0,20的阶乘末尾4个0,可以得到递推公式:当0<n<5时,f(n) = 0;当n>=5时,f(n) = k+f(k!),其中k = n/5;
证明:首先我们知道在一堆乘法中产生0的途径只有2*5得到10,所以有几对2,5就可以得到几个0.下面我们可以将n!分解,n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是一个不含因子“5”的整数。对于序列5,10,15,······,5(k-1),5k,中每一个数都含有因子5,并且在区间(5(k-1),5k) 内总有一个2产生一个0,将上述序列提出一个5得到n!= 5^k * k! * a,其中k!可以递归的得到其满足结论1.
有了上面的结论,我们知道f(n!) 只与5因子个数有关。f(n!) = f(5^k * k! * a) = k + f(k!) = k + f(k!),其中k = n / 5(取整)。
5、递归实现单链表逆转。
Node *Reverse(Node *head)
{
Node *p=head;
if(p==NULL)
return NULL; //若是空链表,返回空
Node *q=p->next;
if(q==NULL)
return p; //若只有一个结点,直接返回
else
head=Reverse(q); //记录子序列的新的头结点
q->next=p; //当前结点与已经逆置的子序列看成是前后的两个结点p,q,作相应的逆置操作
p->next=NULL;
return head; //返回新的子序列的头结点
}
6、N个人围一圈,数第m个人出来,然后从第m个人下一个人开始继续数,直到只剩下一个人,求剩下的人的编号。
int main()
{
int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sum = 10, num = 5;
int i = 0;
while (sum > 1)
{
num = 5;
while (num > 0)
{
if (a[i] != -1)
{
num--;
if (num == 0)
{
a[i] = -1;
}
}
i = (i + 1) % 10;
}
sum--;
}
for (i = 0; i < 10; i++)
{
cout << a[i]<<" "<< endl;
}
return 0;
}