news 2026/5/28 17:26:56

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/21 17:14:36

HoRain云--HTTP缓存策略全解析:性能优化必知

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/5/21 7:51:28

HoRain云--深入解析Linux内核current机制

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/5/10 6:19:08

告别错位与分页噩梦:Excel转PDF完美指南,让表格完整如初

“为什么我的Excel表格一转成PDF&#xff0c;右边的列就被无情地截断了&#xff1f;”“好好的一个表格&#xff0c;转成PDF后被分成了三页&#xff0c;完全没法看&#xff01;”相信每一个和Excel打交道的职场人&#xff0c;都曾被这些问题深深困扰。将精心制作的Excel表格转换…

作者头像 李华
网站建设 2026/5/1 9:29:03

从确定到概率:早停机制的进阶理解与超越阈值的自适应性实现

好的&#xff0c;收到您的需求。我将以您提供的随机种子为灵感&#xff0c;深入探讨“早停机制”这一技术&#xff0c;旨在提供一篇兼具深度、新颖性和实践指导价值的技术文章。从确定到概率&#xff1a;早停机制的进阶理解与超越阈值的自适应性实现 摘要&#xff1a;早停&…

作者头像 李华
网站建设 2026/5/23 3:00:47

基于 QT(C++)实现的(图形界面)IM 即时通讯软件

IM 即时通讯软件 1 引言 1.1 项目概述 本项目时北京理工大学计算机学院小学期实训项目。让我们练习了 Linux 环境下的 socket 编程&#xff0c;会使用终端指令来操作 Linux&#xff0c;同时熟悉 QT 在项目进程中构建 UI 和封装数据的作用&#xff0c;锻炼面向对象的编程思想…

作者头像 李华
网站建设 2026/5/23 8:02:02

IT项目商业价值陈述模板(含3种业务场景案例)

一、 模板核心结构&#xff08;填空式&#xff09; 【项目名片】 【第一部分&#xff1a;价值定位&#xff08;1页讲清Why&#xff09;】 1. 业务痛点与机会&#xff08;用业务语言描述&#xff09; 2. 项目价值主张&#xff08;一句话说清&#xff09; 3. 战略对齐度 【第二部…

作者头像 李华