19116 丑数

19116 丑数

Description

“丑数”是指除了质因子2,3,5,不含其它质因子的正整数,例如由小到大前10个“丑数”为
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, ...
现要求编写一个程序,输出指定第几位的“丑数”。

输入格式

第一行为正整数T(T<=10000), 表示case的数目。
此后T行,每行一个正整数 n (n <= 100000000).

输出格式

每一个n,输出第n个“丑数”

输入样例

3
1
2
9

输出样例

1
2
10

作者 admin

#include<iostream>
using namespace std;
int Min(int a,int b,int c)
{
    int d=a<b?a:b;
    return c<d?c:d;
}
int main()
{
    int T;cin>>T;
    while(T--)
    {
        int n;cin>>n;
        int i;
        int u[n];
        u[1]=1;
        int index_2=1,index_3=1,index_5=1;
        for(i=2;i<=n;i++)
        {
            int c=Min(2*u[index_2],3*u[index_3],5*u[index_5]);
            u[i]=c;
            if(c==2*u[index_2])index_2++;
            if(c==3*u[index_3])index_3++;
            if(c==5*u[index_5])index_5++;
        }
        cout<<u[n]<<endl;
    }
}

Mark

已知1、2、3、5为丑数,且任意丑数相乘都是丑数,以此规则生成丑数序列。

2*1 == 2    3*1 == 3    5*1 == 5  取最小值2为新的丑数,即第二个丑数为2,则2已经乘过第一个丑数1,下次2就只能乘第二个丑数2
 2*2 == 4    3*1 == 3    5*1 == 5  取最小值3为新的丑数,即第三个丑数为3,则3已经乘过第一个丑数1,下次3就只能乘第二个丑数2
 2*2 == 4    3*2 == 6    5*1 == 5  取最小值4为新的丑数,即第四个丑数为4,则2已经乘过第二个丑数2,下次2就只能乘第三个丑数3
 2*3 == 6    3*2 == 6    5*1 == 5  取最小值5为新的丑数,即第五个丑数为5,则5已经乘过第一个丑数1,下次5就只能乘第二个丑数2
 2*3 == 6    3*2 == 6    5*2 == 10 取最小值6为新的丑数,即第六个丑数为6,则认为2已经乘过第三个丑数3,3已经乘过第二个丑数2
————————————————
版权声明:此段解释摘取自CSDN博主「Hunter_Kevin」的原创文章。
原文链接:https://blog.csdn.net/Hunter_Kevin/article/details/117536167

版权声明:本文为 溪月阁 | MoBrook 博主「 皓月 」的原创文章遵循用 CC BY-NC-SA 4.0 版权协议进行许可,转载请附上原文出处链接及本声明。

本文链接https://mobrook.cn/index.php/19116-%e4%b8%91%e6%95%b0/

上一篇:

没有了,已经是最新文章