c++的有难度面试题

博客主要围绕C++中new的使用展开,介绍了new分配单个对象和数组时的初始化情况。还讲解了从0到n - 1中随机等概率输出m个不重复数的算法,分析了每个数被输出的概率,最后提及prim函数分解质因数的问题。

1下面描述正确的是

1

2

int *p1 = new int[10]; 

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

 p1和p2申请的空间里面的值都是随机值

p1和p2申请的空间里的值都已经初始化
p1申请的空间里的值是随机值,p2申请的空间里的值已经初始化
p1申请的空间里的值已经初始化,p2申请的空间里的值是随机值

解析:对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()

在C++primer(第5版)中关于new的讨论有:

1、new当个对象

new在自由空间分配内存,但其无法为其分配的对象命名,因次是无名的,分配之后返回一个指向该对象的指针。

1

int *pi = new int// pi指向一个动态分配的,未初始化的无名对象

此new表达式在自由空间构造一个int类型对象,并返回指向该对象的指针。

默认情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的对象的值是无定义的,而类类型对象将用默认构造函数进行初始化

2、new(多个对象)数组

new分配的对象,不管单个对象还是多个对象的分配,都是默认初始化。但可以对数组进行值初始化,方法就是:在大小之后添加一对空括号。

1

2

int *pia = new int[10];    // 10个未初始化int

int *pia2 = new int[10](); // 10个值初始化为0的int

2下面的程序可以从0....n-1中随机等概率的输出m个不重复的数。这里我们假设n远大于m

1

2

3

4

5

6

7

8

9

10

knuth(int n, int m)

    srand((unsigned int)time(0)); 

    for (int i = 0; i < n; i++) { 

        if ( ) { 

            cout << i << endl;

            ( );

        }

     }

}

rand()%(n-i)<=m m--

rand()%(n-i)<m   m--
rand()%(n-i)>=m   m++
rand()%(n-i)>m   m++

为了方便解释假设n等于10,m等于5:
第一次rand()%(n-0)的余数范围是0~9,有可能小于m(=5),可以输出i=0;随后i++,m--
第二次rand()%(n-1)的余数范围是0~8,有可能小于m(=4),可以输出i=1;随后i++,m--
...
第五次rand()%(n-4)的余数范围是0~5,有可能小于m(=1),可以输出i=4;随后i++,m--得到i=5,m=0

第六次rand()%(n-5)的余数范围是0~4,不可能小于m(=0),算法结束。

倘若rand()%(n-i)<=m,则第六次还满足条件,意味着多输出的一次;

而rand()%(n-i)>=m,将会因为判断条件不满足而提早退出。因此选B

由这个for循环循环n次,且在满足条件时才输出i,可知,输出m个不同值的要求已满足,因为每次输出的都是i值,而i值每次都是不一样的,m--保证了程序在输出了m个值后就停止循环。

在i=0时,rand()%(n-i)的取值范围为0到n-1,共n个数,此时要输出0只需要rand()%(n-i)小于m,故i=0被输出的概率为m/n;

在i=1时,rand()%(n-i)的取值范围为0到n-2,共n-1个数,若i=0没有被输出,则m--未被执行,此时i=1被输出的概率为m/(n-1),若i=0已经被输出了,则m变为m-1,此时i=1被输出的概率为(m-1)/(n-1);由概率论的知识,可知此时i=1被输出的概率为

P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;以此类推,可知每个数被输出的概率都为m/n

以下prim函数的功能是分解质因数。括号内的内容应该为?

1

2

3

4

5

6

7

8

9

10

void prim(int m, int n)

 {

     if (m >= n)

     {

         while (        ) n++;

         (     );

         prim(m, n);

         cout << n << endl;

     }

 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值