Chinaunix首页 | 论坛 | 博客
  • 博客访问: 613905
  • 博文数量: 79
  • 博客积分: 848
  • 博客等级: 军士长
  • 技术积分: 1800
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-26 19:30
文章分类

全部博文(79)

文章存档

2015年(4)

2013年(39)

2012年(36)

分类: C/C++

2012-10-30 16:05:11

闲来无聊,大家就又聊起了近来公司的笔试题。在这个有点无聊的下午,上班之余偷摸来这调侃几句。
题目是这样的:现在有100枚硬币全都是正面朝上的,第一次翻动硬币的时候,将所有的都翻了过来。第二次将第二个、第四个、第八个。。。。。。翻了过来,第三次将第三个,第六个、第九个。。。。翻了过来,依此类推,直到我翻了100次,请问此时正面朝上的硬币个数!
一听完这道题目,二话没说我就向程序设计上想了,互联网公司的笔试嘛……必须是道算法设计题,由此思维定势产生!且看我下面蛋疼的解答:
第一次翻动位置一的倍数的硬币!
第二次翻动位置是二的倍数的硬币!
第三次翻动位置为三的倍数的硬币!



第100次翻动位置为100的倍数的硬币!
还有就是硬币的状态只跟它被翻动的次数有关,如果被翻动了偶数次就肯定是正面朝上的!还有就是硬币所在位置跟第几次翻动之间存在约数关系,那么这个题目就变成了有m个硬币,翻动了n次,求在1——n之间m的约数有多少个的问题了!


点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;
  3. #define m 100                  //硬币个数
  4. #define n 100                  //翻动次数
  5. int main()
  6. {
  7.     int counter[m];
  8.     int result = 0;
  9.     int k;
  10.     for(k  = 0; k < m; k++)    //初始化计数的数组置为0
        {
            counter[k] = 0;
        }
  11.     if(n == 1)
  12.     {
  13.         for(k  = 0; k < m; k++)
            {
                counter[k] = 1;
            }
  14.     }
  15.     else
  16.     {
  17.         for(k = 0; k < n; k++) //初始化数组因为本身肯定被翻动初始化为1
  18.         {
  19.             counter[k] = 1;
  20.         }
  21.         for(int i = 1; i <= m; i++)
  22.         {
  23.             for(int j = 1; (j <= n) && (j <= i/2); j++)
  24.             {
  25.                 if((i % j) == 0)
  26.                 {
  27.                     counter[i-1]++;
  28.                 }
  29.             }
  30.         }
  31.     }
  32.     for(k = 0; k < m; k++)
  33.     {
  34.         if((counter[k] % 2) == 0)//判断约数个数为偶数的硬币个数
  35.         {
  36.             result++;
  37.         }
  38.     }
  39.     cout << "正面朝上的硬币个数为:" << result << endl;
  40.     return 0;
  41. }
结果得到:

点击(此处)折叠或打开

  1. 正面朝上的硬币个数为:90
自认为算得还比较快,我的程序还没有写完就有人给出结果了!!哎呀,仔细一想这才感觉自己好囧呀!!!其实在这个题目中,我们不需要计算每个硬币的位置的约数个数,只需要知道约数个数是奇数还是偶数就行了,还有就是加上1和这个数本身,除了平方数之外,它的约数个数一定是偶数,因为约数都是成对出现的!!
那么在这个题目中我们只需要找出1-100之间的平方数就解决问题了:1、4、9、16、25、36、49
、64、81、100,除了他们之外,其余位置的约数全是偶数因而全是正面!!!
唉……这件事告诉我们凡事开始做之前一定要仔细的想一下,思维定势害死人呀!!!!


阅读(2516) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~