丑数<数学技巧>

时间:2023-03-09 19:52:49
丑数<数学技巧>

题意:丑数就是质因子只有2,3,5 ,7,的数,另外1也是丑数。求第n(1=<n<=5842)个丑数,n=0,结束。

思路:根据丑数的定义,丑数应该是另一个丑数乘以2、3、5或者7的结果(1除外)。那么,现在最主要的问题是如何排序,而且使得求得数不重复。

<阶梯式上升>:从ans[1]=1,p1=1,p2=1,p3=1,p4=1,分别用2,3,5,7乘ans[px],得到一个v(min),这个v就是下一个ans,

同时,对应的px++;

技巧:因为题目中是多组输入,所以没必要没输入一个数就把程序跑一遍,而且n有上限,索性用类似于打表的方式把n<=上限的结果计算出来,每次直接输出就可以了,节省时间。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll ans[6000];
void fuck()
{
ans[1]=1;int p2 = 1, p3 = 1, p5 = 1, p7 = 1;int cnt = 1;//阶梯式上升
while (cnt<=5842)
{
ll v = min(min(ans[p2] * 2, ans[p3] * 3),min( ans[p5] * 5, ans[p7] * 7));
if (v == ans[p2] * 2) ++p2;
if (v == ans[p3] * 3) ++p3;
if (v == ans[p5] * 5) ++p5;
if (v == ans[p7] * 7) ++p7;
ans[++cnt] = v;
}
}
int main ()
{
int n;
fuck();
while(~scanf("%d",&n)&&n)
{
printf("%lld\n",ans[n]);
}
return 0;
}