微软的一道面试题

来源:互联网 发布:巨星知我心txt百度云 编辑:程序博客网 时间:2024/05/16 23:39

2 3 5求他们的n次方组成的序列,有小到大排列,求第n个。

直观的感觉,分别求出每个数的n(0,1,2,3.。。)次方,把他们的最小值最为当前的序列值,指到个数为n

void microsoft1(int n)
{
   assert(n>0);
   int p2=1,p3=1,p5=1;
  
   int index=0;
   int result=0;
   while(index<n)
   {
      if(p2< p3 && p2< p5)
 {
 result=p2;
 p2 *=2;
 }
 else if(p3<p2 && p3< p5)
 {
     result=p3;
 p3*=3;
 }
 else if(p5<p2 && p5<p3)
 {
     result=p5;
 p5*=5;
 }
 else if(p2==p3 && p2 !=p5)
 {
     result=p2;


 p2*=2;  
 p3*=3;
 }
      else if(p2==p5 && p2 !=p3)
 {
     result=p2;
 p2*=2;  
 p5*=5;
 }
      else if(p3==p5 && p2 !=p3)
 {
     result=p3;
 p3*=3;
 p5*=5;
 }
 else
 {
     result=p2;
 p2*=2;
          p3*=3;
 p5*=5;
 
 }
     cout<<result<<"   ";
index++;
   }


   cout<<endl;
}

简单点,假设当前序列的最后一个值是X,则序列的下一个值Xnext 必定是2 3 5 的某次方(y)中的较小值,关键是如何确定y。可以从2的幂序列中找到第一个大于X的值M2,同理可以求得M3,M5,那么Xnext=min(M2,M3,M5)



void microsoft(int n)
{
   assert(n>=0);
   int p2=1;
   int p3=1;
   int p5=1;


   int index=0;
   int result=0;
   while(index<n)
   {
       result=min(p2,p3,p5);
  cout<<result<<"  ";


  while(p2<=result)
  p2= p2*2;
  while(p3<=result)
  p3=p3*3;
  while(p5<=result)
  p5=p5*5;
  ++index ;
   }
   
   cout<<endl;
}

这个题和剑指offer上的求质因数只有2 3 5的丑事类似。

原创粉丝点击