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的丑事类似。