阿里巴巴2016校招笔试题
①、C++
以下程序输出结果是( )
class A
{
public:
virtual void func(int val = 1)
{
std::cout << "A->" << val << std::endl;
}
virtual void test()
{
func();
}
};
class B:public A
{
public:
void func(int val = 0)
{
std::cout << "B->" << val << std::endl;
}
};
int main(int argc,char* argv[])
{
B*p = new B;
p->test();
return 0;
}
A:A->0
B:B->1
C:A->1
D:B->0
答案:B
解析:由于p指向了继承类B的对象,所以,在调用A中的test之后,虚函数func()会调用继承类B的函数,而默认形参仍然会使用test所在的类A的形参1,从而输出B->1。
②、数学计算将1,2,3,......,99,100任意排列成一个圈,相邻两数的差的绝对值求和最多为( )
A:100
B:198
C:200
D:500
E:2500
F:5000
答案:F
解析:定义1-50为“小数”,51-100为“大数”,将“相邻元素的差的绝对值之和”简称“绝差之和”。为了将绝差之和取最大,应该避免将“大数”和“大数”放在一起。因此,可以考虑间隔排布。形成:1,100,2,99,3,98,4,97……,50,51的.序列。而事实上,这个序列即绝差之和最大的序列。可使用如下证明:
1、 如下图所示:如果将小数和小数交换,得到的序列绝差之和不变。将小数x和y互换。假定交换之前,x和y的相邻元素分别为a、b和c、d。则交换之前的绝差为:(a-x)+(b-x)+(c-y)+(d-y),交换之后的绝差为:(a-y)+(b-y)+(c-x)+(d-x),二者相等。
2、 如下图所示:如果将大数和大数交换,得到的序列绝差之和不变。将大数a和b互换。假定交换之前,a和b的相邻元素分别为x、y和z、w。则交换之前的绝差为:(a-x)+(a-y)+(b-z)+(b-w),交换之后的绝差为:(b-x)+(b-y)+(a-z)+(a-w),二者相等。
3、 如下图所示:如果将大数和小数交换,得到的序列绝差之和必然减小。将小数a和大数z互换。假定交换之前,a和z的相邻元素分别为x、y和b、c。则交换之前的绝差为:(a-x)+(a-y)+(b-z)+(c-z),交换之后的绝差为:|x-z|+|y-z|+|b-a|+|c-a|,由于x、y、z更接近,a、b、c更接近,所以交换后绝差变小。
因此,无论如何交换,绝差之和都无法增大。即原序列的绝差之和是最大的。它形成的绝差序列是99,98,97,96……,2,1,50,这100个数的和为5000。
③、计算机基础
如果下列的公式成立:84*148=B6A8。则采用的是( )进制表示的。
A:15
B:11
C:12
D:14
E:16
F:以上都不对
答案:C
解析:1、常规做法:假定数值是x进制的,则写出等式:(8x+4)*(x2+4x+8)=11x3+6x2+10x+8,化简得到(3x2+6x+2)*(x-12)=0,则x的非负整数解为x=12。
2、“启发式”做法:在十进制体系下,左侧个位乘积4*8=32;右侧个位为8,差32-8=24,从而进制必然是24的约数。只有C选项12是24的约数。
版权声明:此文自动收集于网络,若有来源错误或者侵犯您的合法权益,您可通过邮箱与我们取得联系,我们将及时进行处理。
本文地址:https://www.gunzhua.com/jiuye/bishi/26569.html