方法一:暴力枚举2,3,4......,依次判断n能否被2|3|5整除,直到找到第1500个
#include <iostream>
//#include <string.h>
using namespace std;
int main(int argc, char *argv[])
{
int count = 1;
int i;
for(i=2;count!=1500;i++)
{
cout<<i<<endl;
if(i%2==1 || i%3==1 || i%5==1)
count++;
}
cout<<i<<endl;
getchar();
return 0;
}
稍微讲点技巧,运行速度来看,感觉差不多
如果x能被2或者3或者5整除,那么x必然可以表达成:2y或者3y或者5y的形式
所以我们只要按从小到大的顺序列举可以表达成:2y,3y,5y的数,直到列举成1500个,即使所求的解。
这里要住的是可能有数同时满足其中2个或者3个表达式。
#include<iostream>
#include<stack>
using namespace std;
int max(int a,int b,int c)
{
if(a > b)
{
if(a > c)
{
return a;
}else{
return c;
}
}else
{
if(b>c)
{
return b;
}else{
return c;
}
}
}
int function(int a,int b,int c,int n)
{
int count = 1;
int maxa = a;
int maxb = b;
int maxc = c;
while(count<n)
{ cout<<count<<maxa<<maxb<<maxc<<endl;
if(maxa < maxb && maxa <maxc)
{
count++;
maxa += a;
}
else if(maxb < maxa && maxb <maxc)
{
count++;
maxb += b;
}
else if(maxc < maxb && maxc <maxa)
{
count++;
maxc += c;
}else if(maxa == maxb && maxc > maxa)
{
count++;
maxa += a;
maxb += b;
}
else if(maxc == maxb && maxa > maxc)
{
count++;
maxc += c;
maxb += b;
}
else if(maxa == maxc && maxb > maxa)
{
count++;
maxa += a;
maxc += c;
}else{
count++;
maxa += a;
maxb += b;
maxc += c;
}
}
return max(maxa,maxb,maxc);
}
int main()
{
cout<<function(2,3,5,1500);
getchar();
getchar();
return 0;
}
我记得还有一种方法,30以内的满足条件的数分别是:{2, 3, 4, 5, 6, 8, 9, 10,12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28,30} 共计22个
所以求第N个满足条件的数,先求得第(N/22)*22个数(N为整型), 为(N/22)*30,然后从这个数开始往后求N%22个满足条件的数即可。