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/5/23 9:42:33

百考通AI:您的智能学术助手,让开题报告写作化繁为简

在当今快节奏的学术与职场环境中&#xff0c;高效、精准地完成一份高质量的开题报告&#xff0c;是每一个学生和研究者面临的共同挑战。从选题的迷茫、框架的搭建&#xff0c;到文献的搜集与整理&#xff0c;再到创新点的提炼与论证&#xff0c;每一个环节都耗费着大量的时间与…

作者头像 李华
网站建设 2026/6/9 20:53:14

微服务架构下的 UI 测试策略

在微服务架构中&#xff0c;用户界面&#xff08;UI&#xff09;测试作为端到端&#xff08;E2E&#xff09;测试的核心环节&#xff0c;直接关系到最终用户体验和业务目标实现。然而&#xff0c;微服务的分布式、多语言和独立部署特性&#xff0c;为 UI 测试带来了独特挑战。本…

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

VirtualLab Fusion应用:参数变化分析仪

摘要 在复杂光学系统的设计、优化和公差处理过程中&#xff0c;通常需要分析一组不同系统参数的特性&#xff0c;而不仅仅是单一配置。参数运行是在所需参数空间内扫描系统参数的指定工具。但它无法从可进一步处理的单个结果中定义和评估优化函数。新的参数变化分析仪正是弥补这…

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

HoRain云--Go语言条件语句全解析

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

作者头像 李华
网站建设 2026/6/10 3:58:51

HoRain云--Go语言函数详解:从入门到精通

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

作者头像 李华