hdu 1058

                                           Humble Numbers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 23902 Accepted Submission(s): 10447


Problem Description
A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers.

Write a program to find and print the nth element in this sequence


Input
The input consists of one or more test cases. Each test case consists of one integer n with 1 <= n <= 5842. Input is terminated by a value of zero (0) for n.


Output
For each test case, print one line saying "The nth humble number is number.". Depending on the value of n, the correct suffix "st", "nd", "rd", or "th" for the ordinal number nth has to be used like it is shown in the sample output.


Sample Input

1
2
3
4
11
12
13
21
22
23
100
1000
5842
0



Sample Output

The 1st humble number is 1.
The 2nd humble number is 2.
The 3rd humble number is 3.
The 4th humble number is 4.
The 11th humble number is 12.
The 12th humble number is 14.
The 13th humble number is 15.
The 21st humble number is 28.
The 22nd humble number is 30.
The 23rd humble number is 32.
The 100th humble number is 450.
The 1000th humble number is 385875.
The 5842nd humble number is 2000000000.


这道题大意是,一个序列中只含有丑数,丑数就是他的因子只有2,3,5,7。并且序列中的数从小到大依次排列,我最初的想法就是将2,3,5,7这几个数分别乘以1~

2000000000/2,然后再将该序列进行排序。后面一想这样不仅会出现重复的数,而且还会造成很大的浪费。
后面想了一个比较好的方法,只是将上面的思路改了下,我不用分开来乘,一起乘。什么意思类?意思就是定义四个数,这四个数的初始值都为1,然后他们每次乘以自己的倍数,也就是2,3,5,7,然后每次取其中最小的,依次放入序列中。还有一个问题就是,怎样去重了?

看代码吧:

<span style="font-size:18px;">
#include <iostream>
#include<cstdio>
#include<algorithm>
#define maxn 6000
using namespace std;
int a[maxn],visit[maxn];
int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
int min4(int a,int b,int c,int d)
{
    return min(min(a,b),min(c,d));
}
void init()
{
    int n=1;
    a[1]=1;
    int x2=1,x3=1,x5=1,x7=1;
    while(n<=5842)
    {
        a[++n]=min4(2*a[x2],3*a[x3],5*a[x5],7*a[x7]);
        if(a[n]==2*a[x2])//这里千万不能写成if else,因为可能他既是2的倍数,也可能是其他三个数的倍数
            x2++;
        if(a[n]==3*a[x3])//例如a[n]=6,此时,x2=3,x3=2,如果他们两个有一个不加,下一个数还会出现6,因为是取最小的
            x3++;
        if(a[n]==5*a[x5])
            x5++;
        if(a[n]==7*a[x7])
            x7++;
    }
}
int main()
{
    init();
    int n;
    while(~scanf("%d",&n)&&n)
    {
        if(n%10 == 1&&n%100!=11)
        printf("The %dst humble number is ",n);
        else if(n%10 == 2&&n%100!=12)
        printf("The %dnd humble number is ",n);
        else if(n%10 == 3&&n%100!=13)
        printf("The %drd humble number is ",n);
        else
        printf("The %dth humble number is ",n);
        printf("%d.\n",a[n]);
    }
    return 0;
}

</span>

另外,还有一个很重要的地方就是输出格式,1是以st,2是以nd,3是rd结尾的,其余的全是以th结尾

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值