news 2026/5/1 6:37:43

UVa 136 Ugly Numbers

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 136 Ugly Numbers

题目描述

“丑数”(Ugly Numbers\texttt{Ugly Numbers}Ugly Numbers)是指那些质因数只包含222333555的正整数。通常约定111也算作丑数。前111111个丑数为:

1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … 1,\ 2,\ 3,\ 4,\ 5,\ 6,\ 8,\ 9,\ 10,\ 12,\ 15,\ \dots1,2,3,4,5,6,8,9,10,12,15,

本题要求编写程序,找出并输出第150015001500个丑数。

输入格式

无输入。

输出格式

输出一行,格式为:

The 1500'th ugly number is <number>.

其中<number>应替换为计算出的第150015001500个丑数。


题目分析

我们需要生成一个序列,序列中的每个数都满足:其质因数只包含222333555。换句话说,对于任意丑数nnn,存在非负整数aaabbbccc,使得:

n=2a×3b×5c n = 2^a \times 3^b \times 5^cn=2a×3b×5c

本题的核心在于按顺序生成丑数,并找到第150015001500个。


解题思路

方法一:模拟法(朴素判断)

一种直接的方法是:从111开始逐个判断每个正整数是否为丑数,直到找到第150015001500个为止。

判断丑数的方法:

  • 将该数不断除以222333555,直到不能再被这三个数整除。
  • 若最终结果为111,则该数是丑数。

优点:实现简单,易于理解。
缺点:效率较低,因为需要检查很多非丑数。不过对于第150015001500个丑数,其值并不大(约为8.5×1058.5 \times 10^58.5×105)。

时间复杂度O(nlog⁡n)O(n \log n)O(nlogn),其中nnn是第150015001500个丑数的值。


方法二:优先队列法(高效生成)

我们可以利用最小堆(优先队列)来按顺序生成丑数:

  1. 初始化一个最小堆,将111压入堆中。
  2. 每次从堆中取出最小元素xxx,它就是当前最小的丑数。
  3. x×2x \times 2x×2x×3x \times 3x×3x×5x \times 5x×5压入堆中(若尚未出现过)。
  4. 用一个集合记录已生成的丑数,避免重复入堆。
  5. 重复上述过程,直到取出第150015001500个丑数。

优点:只生成丑数,无需判断非丑数,效率高。
缺点:需要额外的数据结构(堆和集合)。

时间复杂度O(nlog⁡n)O(n \log n)O(nlogn),其中n=1500n = 1500n=1500


代码实现

方法一代码(模拟法)

// Ugly Numbers// UVa ID: 136// Verdict: Accepted// Submission Date: 2016-01-08// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){longlongintstart=1;intcounter=1;while(counter<1500){start++;longlongintnumber=start;while(number%2==0)number/=2;while(number%3==0)number/=3;while(number%5==0)number/=5;if(number==1)counter++;}cout<<"The 1500'th ugly number is "<<start<<"."<<endl;return0;}

方法二代码(优先队列法)

// Ugly Numbers// UVa ID: 136// Verdict: Accepted// Submission Date: 2016-01-08// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;typedeflonglongintbigNumber;intmain(){intfactors[3]={2,3,5};set<bigNumber>uglyNumbers;priority_queue<bigNumber,vector<bigNumber>,greater<bigNumber>>candidates;candidates.push(1);for(inti=1;i<=1500;i++){bigNumber top;do{top=candidates.top();candidates.pop();}while(uglyNumbers.count(top)>0);uglyNumbers.insert(top);for(intj=0;j<3;j++){bigNumber next=top*factors[j];if(uglyNumbers.count(next)==0)candidates.push(next);}if(i==1500){cout<<"The 1500'th ugly number is "<<top<<"."<<endl;break;}}return0;}

总结

本题展示了两种生成丑数的方法:

  • 模拟法:简单直接,适合输入规模不大的情况。
  • 优先队列法:高效且可扩展,适合需要生成大量丑数的场景。

两种方法均能快速通过,输出结果一致。对于此类“按条件生成序列”的问题,优先队列法是一种非常实用的技巧。

最终答案:第150015001500个丑数为859963392859963392859963392

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:35:01

OoderAgent V0.6.5 Nexus 重磅发布:开启超级智能体开发框架新纪元

前言&#xff1a; v0.6.5 使用了一个特别的代号&#xff0c;Nexus&#xff08;枢纽&#xff09;她不再是一次简单的技术升级。而是一次重生。 从0.6.2到0.6.5我们在AI的驱动先快速的迭代&#xff0c;从从基础架构到核心升级&#xff0c;再到技能统一提升&#xff0c;直到0.6.5…

作者头像 李华
网站建设 2026/5/1 6:36:15

Redis各种架构安装部署

本教程将演示在 linux 环境下安装 Redis7&#xff0c;给⼤家最简单&#xff0c;最快捷的安装⽅式&#xff0c;其中包括单机部署、主从部署、哨兵部署、集群部署的安装以及相应的架构介绍。 一、单机部署 1. 检查安装 gcc 环境 Redis是由C语⾔编写的&#xff0c;它的运⾏需要C环…

作者头像 李华
网站建设 2026/4/19 22:12:00

如何防范日益增长的数据威胁?

信息安全&#xff08;简称信安&#xff09;涵盖各类工具与流程&#xff0c;用于防范、检测并补救针对数字化和非数字化敏感信息的网络攻击与安全威胁&#xff0c;同时也负责对影响信息安全的流程、威胁及系统进行归档记录。下文将为您介绍信息安全的相关知识。 如上所述&#x…

作者头像 李华
网站建设 2026/4/24 0:47:30

Cursor使用教程

https://cursor.com/cn/docs/cli/shell-mode

作者头像 李华
网站建设 2026/4/24 9:17:12

本地部署的物联网平台

物联网平台 - Thinglinks-iot ## &#x1f31f; 项目简介 一个功能完备、高可扩展的物联网平台&#xff0c;提供完整的设备接入、管理和数据处理解决方案。支持多种网络协议&#xff0c;具备强大的消息解析和实时告警能力&#xff0c;帮助企业快速构建物联网应用。 该项目现已…

作者头像 李华
网站建设 2026/4/30 23:38:00

如何设置VirtualLab Fusion结果的格式

摘要虽然为所需光学任务提供方便的工具&#xff0c;以获得快速和准确的结果&#xff0c;是任何光学仿真软件的主要目的&#xff0c;但多功能后处理的价值不应被低估。对结果数据外观的调整不仅可以满足期刊或报告中出版物的特定要求&#xff0c;而且还可以强调和突出结果中有趣…

作者头像 李华