【题解】丑数

题目描述

如果一个数的素因子只包含2,3,5或7,那么我们把这种数叫做丑数。序列1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24,  25,27...展示了前20个丑数。

请你编程寻找这个序列中的第n个元素。

输入输出格式

输入格式

一行,为一个整数n。(1≤n≤5842)

输出格式

一行,“The nth humble number is number.”。里面的n由输入中的n值替换,“st”,“nd”,“rd”和“th”这些序数结尾的用法参照输出样例。

输入输出样例

输入样例

5842

输出样例

The 5842nd humble number is 2000000000.

题解

直接枚举2,3,5,7能构成的数即可,注意精度问题。

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int n;
int a[31 * 20 * 14 * 12 + 1], sa;
const int maxn = 2000000000;
const int p2 = pow(2, 30), p3 = pow(3, 19), p5 = pow(5, 13), p7 = pow(7, 11);

int main()
{
    cin >> n;
    long long now;
    for(register long long i = 1; i <= p2; i *= 2)
    {
        now = i;
        for(register long long j = 1; j <= p3; j *= 3)
        {
            if(now * j > maxn) break;
            now *= j;
            for(register long long k = 1; k <= p5; k *= 5)
            {
                if(now * k > maxn) break;
                now *= k;
                for(register long long l = 1; l <= p7; l *= 7)
                {
                    if(now * l > maxn) break;
                    a[++sa] = now * l;
                }
                now /= k;
            }
            now /= j;
        }
    }
    sort(a + 1, a + sa + 1);
    cout << "The " << n;
    if(n % 100 >= 11 && n % 100 <= 13) cout << "th";
    else if(n % 10 == 1) cout << "st";
    else if(n % 10 == 2) cout << "nd";
    else if(n % 10 == 3) cout << "rd";
    else cout << "th";
    cout << " humble number is " << a[n] << ‘.‘;
    return 0;
}

参考程序

原文地址:https://www.cnblogs.com/kcn999/p/10351479.html

时间: 2024-10-08 16:41:28

【题解】丑数的相关文章

AC日记——丑数 codevs 1246

1246 丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是个对于一个输入的S的丑数集合.注意:我们不认为1 是一个丑数.你的工作是对于输入的集合S去寻找集合中的第N个丑数.longint(signe

[usaco]丑数

思考 首先产生的思路是,用小根堆的最小元素(top)来与 k个数 相乘,之后把结果再扔进小根堆,每次操作得到的即是第k小. 不过要注意一下判重.但是非常悲剧的是 在遇到极限数据的时候TLE了.在思索无果的情况下,偷偷去看了发题解.发现题目的解法还是比较巧妙的. #include <queue> #include <cstdio> #include <iostream> #define LL long long using namespace std; LL num[10

洛谷P2723 丑数 Humble Numbers

P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找

Save Princess(丑数)

Save Princess 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Yesterday, the princess was kidnapped by a devil. The prince has to rescue our pretty princess. "OK, if you want to save the beautiful princess, you must answer my questions correctly."the dev

1246 丑数

1246 丑数 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合.这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它).这是个对于一个输入的S的丑数集合.注意:我们不认为1 是一个丑数.你的工作是对于输入的集合S去寻找集合中的第N个丑数.longint(signe

[剑指offer] 33. 丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数.  leetcode原题,题解链接 class Solution { public: int GetUglyNumber_Solution(int index) { if (index < 7) return index; vector<int> res(index); res[0] = 1; in

【剑指Offer】33:丑数

题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题解: 1 //所有的丑数分为三种类型 2*i,3*i,5*i ,其中 i是数组中的元素,一开始只有1 2 public static int GetUglyNumber_Solution(int index) { 3 // 0-6的丑数分别为0-6 4 if(index<7) { 5 return in

Humble Numbers(丑数) 超详解!

给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑数为 h[n]. 算法 1: 一种最容易想到的方法当然就是从 2 开始一个一个的判断一个数是否为丑数.这种方法的复杂度约为 O( k * h[n]),铁定超时(如果你这样做而没有超时,请跟 tenshi 联系) 算法 2: 看来只有一个一个地主动生成丑数了 : 我最早做这题的时候,用的是一种比较烂的

洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其 它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”.所有答案可以用longint(32位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑