题目是这样的:现在有100枚硬币全都是正面朝上的,第一次翻动硬币的时候,将所有的都翻了过来。第二次将第二个、第四个、第八个。。。。。。翻了过来,第三次将第三个,第六个、第九个。。。。翻了过来,依此类推,直到我翻了100次,请问此时正面朝上的硬币个数!
一听完这道题目,二话没说我就向程序设计上想了,互联网公司的笔试嘛……必须是道算法设计题,由此思维定势产生!且看我下面蛋疼的解答:
第一次翻动位置一的倍数的硬币!
第二次翻动位置是二的倍数的硬币!
第三次翻动位置为三的倍数的硬币!
。
。
。
第100次翻动位置为100的倍数的硬币!
还有就是硬币的状态只跟它被翻动的次数有关,如果被翻动了偶数次就肯定是正面朝上的!还有就是硬币所在位置跟第几次翻动之间存在约数关系,那么这个题目就变成了有m个硬币,翻动了n次,求在1——n之间m的约数有多少个的问题了!
点击(此处)折叠或打开
- #include<iostream>
- using namespace std;
- #define m 100 //硬币个数
- #define n 100 //翻动次数
- int main()
- {
- int counter[m];
- int result = 0;
- int k;
- for(k = 0; k < m; k++) //初始化计数的数组置为0
{
counter[k] = 0;
} - if(n == 1)
- {
- for(k = 0; k < m; k++)
{
counter[k] = 1;
} - }
- else
- {
- for(k = 0; k < n; k++) //初始化数组因为本身肯定被翻动初始化为1
- {
- counter[k] = 1;
- }
- for(int i = 1; i <= m; i++)
- {
- for(int j = 1; (j <= n) && (j <= i/2); j++)
- {
- if((i % j) == 0)
- {
- counter[i-1]++;
- }
- }
- }
- }
- for(k = 0; k < m; k++)
- {
- if((counter[k] % 2) == 0)//判断约数个数为偶数的硬币个数
- {
- result++;
- }
- }
- cout << "正面朝上的硬币个数为:" << result << endl;
- return 0;
- }
点击(此处)折叠或打开
- 正面朝上的硬币个数为:90
哎呀,仔细一想这才感觉自己好囧呀!!!其实在这个题目中,我们不需要计算每个硬币的位置的约数个数,只需要知道约数个数是奇数还是偶数就行了,还有就是加上1和这个数本身,除了平方数之外,它的约数个数一定是偶数,因为约数都是成对出现的!!那么在这个题目中我们只需要找出1-100之间的平方数就解决问题了:1、4、9、16、25、36、49
、64、81、100,除了他们之外,其余位置的约数全是偶数因而全是正面!!!
唉……这件事告诉我们凡事开始做之前一定要仔细的想一下,思维定势害死人呀!!!!
