HDOJ1058 Humble Numbers【优先队列】

本文探讨了HDOJ1058题目“Humble Numbers”的两种解法,一种是逐个测试是否为谦逊数,另一种利用STL优先队列简化过程,实现高效生成指定数量的谦逊数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDOJ1058

题目
在这里插入图片描述
代码
思路一:开始我的想法是把某个范围内的数一一测试是否是humble number,是就存进数组里,不是就测试下一个。但这样的代价是时间超了

//超时代码
#include <stdio.h>
#include <math.h>
int judge_humble(int m)
{
    
    while(m!=1)
    {
        if(m%2==0)
        {
            m = m/2;
        }
        else if(m%3==0)
        {
            m = m/3;
        }
        else if(m%5==0)
        {
            m = m/5;
        }
        else if(m%7==0)
        {
            m = m/7;
        }
        else
        {
            return 0;
        }
    }
    return 1;
} 
int main()
{
    int n, i;
    int count = 2;
    int j = 1;
    int num[5850];
    num[1] = 1;
    while(scanf("%d", &n)&&n!=0)
    {
        for(i=j+1;count<=n;i++)
        {
            if(judge_humble(i))
            {
                num[count] = i;
                count++;
            }
            j = i;
        }
        if(n%10==1&&n!=11)
        {
            printf("The %dst humble number is %d.\n", n, num[n]);
        }
        else if(n%10==2&&n!=12)
        {
            printf("The %dnd humble number is %d.\n", n, num[n]);
        }
        else if(n%10==3&&n!=13)
        {
            printf("The %drd humble number is %d.\n", n, num[n]);
        }
        else
        {
            printf("The %dth humble number is %d.\n", n, num[n]);
        }
        
    }
}

思路二:参照网上的解法,我去学习了一下stl的优先队列,发现用优先队列真的简单很多。优先队列可以定义成greater或less(区别就是一个自动升序排列,一个自动降序排列)。没错!因为是自动的,就省掉了每次放进队列数字以后要排序的烦恼。首先在优先队列里放一个1,然后乘以2,3,5,7压入队列。每次从优先队列队top的数都是队列里最小的,拿它分别乘以2,3,5,7后压入队列,依次循环。

#include<cstdio>
#include<queue>
using namespace std;


int main()
{
    priority_queue <long long,vector<long long>,greater<long long> > q;      //small->big
    long long num[5850];
    num[0] = 0;
    int n, i = 1;
    q.push(1);
    while(scanf("%d", &n)&&n!=0)
    {
        while(i<=n)
        {
            if(q.top()!=num[i-1])
            {
                num[i] = q.top();
                q.push(num[i]*2);
                q.push(num[i]*3);
                q.push(num[i]*5);
                q.push(num[i]*7);
                i++;
            }
            q.pop();
        }
        if(n%10==1&&n%100!=11)
        {
            printf("The %dst humble number is %lld.\n", n, num[n]);
        }
        else if(n%10==2&&n%100!=12)
        {
            printf("The %dnd humble number is %lld.\n", n, num[n]);
        }
        else if(n%10==3&&n%100!=13)
        {
            printf("The %drd humble number is %lld.\n", n, num[n]);
        }
        else
        {
            printf("The %dth humble number is %lld.\n", n, num[n]);
        }
    } 
} 

Conclusion
这次又学会了stl的优先队列,不得不说真的很方便呀。还有vector,map,比一般的数组什么的要好用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值