丑数<数学技巧>

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

思路:根据丑数的定义,丑数应该是另一个丑数乘以23、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
",ans[n]);
    }
    return 0;
}


想的太多,做的太少。
原文地址:https://www.cnblogs.com/pealicx/p/6115644.html