news 2026/6/10 15:42:02

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/6/10 10:10:19

AlphaFold五年成就:AI重塑生物学研究

AlphaFold: Five Years of Impact 自2020年以来&#xff0c;AlphaFold加速了科学进程并推动了全球范围内的生物学发现浪潮——这一成就已获得诺贝尔奖的认可。 五年前&#xff0c;AlphaFold 2解决了蛋白质结构预测问题&#xff0c;为生物学研究开辟了新的途径&#xff0c;并首次…

作者头像 李华
网站建设 2026/6/10 14:23:46

Java快速开发平台深度评测:若依、芋道、Jeesite、JeecgBoot四剑客全解析

引言在数字化转型浪潮中&#xff0c;企业级应用开发效率成为关键竞争力。Java生态中&#xff0c;若依、芋道、Jeesite、JeecgBoot四大开源框架凭借差异化定位&#xff0c;成为开发者手中的"效率利器"。本文将从技术架构、核心优势、上手难度、适用场景四大维度展开深…

作者头像 李华
网站建设 2026/6/10 11:25:01

计算机软件著作权(软著)全解析:价值、流程与应用场景

摘要计算机软件著作权&#xff08;简称“软著”&#xff09;是保护软件创新成果的核心法律工具。本文从软著的定义出发&#xff0c;系统梳理其申请价值&#xff08;个人职业发展、企业经济与政策优势&#xff09;、申请流程&#xff08;材料准备与提交规范&#xff09;&#xf…

作者头像 李华
网站建设 2026/6/10 11:22:02

无头浏览器资源占用优化指南

资源优化的必要性 在软件测试领域&#xff0c;无头浏览器&#xff08;如Headless Chrome、Puppeteer或Playwright&#xff09;已成为自动化测试的核心工具&#xff0c;但其资源占用问题常导致测试延迟和成本飙升。数据显示&#xff0c;未优化的无头浏览器实例可占用高达420MB内…

作者头像 李华