美团网笔试题之正约数
题目是这样的:
50个灯,有50个按钮,编号为1,2,3……50.刚开始灯全部是熄的,现在依次按按钮,每次按到按钮i,i的倍数编号的灯就变一下状态,问到最后开了几盏灯。
这里考的问题其实就是一个数字的正约数的个数是奇数还是偶数的问题。
这个题我在某数学网站中找到的,感谢百度~
然后,我还发现了,这个题是小学六年级的数学题……尼玛啊!!!
其实对于我这样的准程序员来说,遇到这种问题,上来的第一个想法就是,写个小程序,跑一下就知道了~
但是在你笔试的时候,是没有台笔记本放在你面前的。
回来谈这个问题,如何判断一个数字的正约数个数呢?说破了很简单。一个普通的数字,做一个可以整除的除法,通常是这样的一个式子:
a = b / c
而且反过来也是成立的:
c = b / a
所以能够得到结论:一个数的公约数往往是成对存在的。但是存在例外。
这个例外就是完全平方数。比如2 * 2 = 4,这时上面的结论就不成立了。
所以,只有一个完全平方数的正约数个数是奇数的,其余的,都是偶数的。
然后结果就很明显了。
演示结果:
代码演示:(最笨的方法)
1 int GetSpecialNumber(int n) 2 { 3 int counter = 0; 4 for(int i = 1;i <= n;++ i) 5 { 6 if(n % i == 0) 7 { 8 counter += 1; 9 } 10 } 11 return counter; 12 } 13 void Make_It() 14 { 15 int a[50]; 16 //initialize 17 for(int i = 0;i < 50;++ i) 18 { 19 a[i] = i + 1; 20 } 21 //find it 22 int i = 50; 23 while(i --) 24 { 25 if(GetSpecialNumber(a[i]) & 0x01) 26 cout << a[i] << ends; 27 } 28 cout << endl; 29 } 30 int main() 31 { 32 cout << "Hello world!" << endl; 33 int array[] = {10, -1, 3, -11, -20, 33, 1, -6, 13}; 34 cout << MaxSubArray(array, sizeof(array)/sizeof(int)) << endl; 35 //Do_It(); 36 Make_It(); 37 return 0; 38 }