UglyNumber - 找“丑数”

简介: uglynumber的定义是只能被1,2,3,5整除的数 规定1是第一个uglynumber;以此类推,1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 .

uglynumber的定义是只能被1,2,3,5整除的数

规定1是第一个uglynumber;以此类推,1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 ...

 

问题1,给定一个非零int整数,判断是否为ugly number

此数除以2,3,5;看是否能被整除;整除的判断是用hasDigit方法,利用小数来判断的

如果能被整除,递归下去,再除以2,3,5;直到完成判断

 1 /**
 2  * Ugly number1 
 3  * @author Rust Fisher
 4  * Judge the number whether ugly
 5  */
 6 public class UglyNumber1 {
 7     public static boolean hasDigit(double d){
 8         return  d*10%10 != 0;
 9     }
10     /**
11      * @param num
12      * @return boolean whether num is ugly
13      */
14     public static boolean isUgly(int num) {
15         if (num <= 0) {
16             return false;
17         }
18         if (num == 1) {
19             return true;
20         }
21         if (!hasDigit(num/2.0)) {
22             if (isUgly(num/2)) {
23                 return true;
24             }        
25         } 
26         if (!hasDigit(num/3.0)) {
27             if (isUgly(num/3)) {
28                 return true;
29             }
30         }
31         if (!hasDigit(num/5.0)) {
32             if (isUgly(num/5)) {
33                 return true;
34             }
35         }
36 
37         return false;
38     }
39     /**
40      * Find the nth ugly number
41      * @param n
42      * @return the nth ugly number
43      */
44     public static int nthUglyNumber(int n) {
45         if (n <= 0) {
46             return -1;
47         }
48         int count = 0;
49         int i = 0;
50         while (count <= n){
51             if (isUgly(i)) {
52                 count++;
53             }
54             if (count == n) {
55                 break;
56             }
57             i++;
58             
59         }
60         return i;
61     }
62     
63     public static void main(String args[]){
64         int count = 0;
65         for (int i = 0; i < 100; i++) {
66             if (isUgly(i)) {
67                 count++;
68                 System.out.print(i + "\t");
69             }
70             if (count == 10) {
71                 count = 0;
72                 System.out.println();
73             }
74         }
75         System.out.println("\nThe n-th ugly numbers : ");
76         count = 0;
77         for (int i = 1; i < 21; i++) {
78             System.out.print(nthUglyNumber(i) + "  ");
79         }
80         System.out.println("\n用这种方式输出第n个ugly number很没效率");
81     }
82 }

输出:

1	2	3	4	5	6	8	9	10	12	
15	16	18	20	24	25	27	30	32	36	
40	45	48	50	54	60	64	72	75	80	
81	90	96	
The n-th ugly numbers : 
1  2  3  4  5  6  8  9  10  12  15  16  18  20  24  25  27  30  32  36  
用这种方式输出第n个ugly number很没效率

 

问题2:求第n个ugly number

比如第1个ugly number是1,第二个是2,第三个是3 ...

已知1,2,3,5是ugly number,那么接下去的数能够乘以2,3,5得到;一个一个向后推算,直到第n个

设定3个游标,对应因数为2,3,5;利用到因数2一次,index2加一

 1 public class UglyNumber2{
 2     public static int getMin(int a,int b,int c){
 3         int min = a < b ? a : b;
 4         return min < c ? min : c;    
 5     }
 6     public static int nthUglyNumber(int n) {
 7         if (n < 1) {
 8             return -1;
 9         }
10         int index2 = 0, index3 = 0, index5 = 0;  //  three index
11         int[] uglyNums = new int[n];
12         uglyNums[0] = 1;
13         int next = 1;
14         while (next < n) {
15             uglyNums[next] = getMin(uglyNums[index2]*2,uglyNums[index3]*3,uglyNums[index5]*5);
16             if (uglyNums[next] == uglyNums[index2]*2) index2++;// find out which index should move
17             if (uglyNums[next] == uglyNums[index3]*3) index3++;// index moving forward
18             if (uglyNums[next] == uglyNums[index5]*5) index5++;
19             next++;
20         }
21         return uglyNums[next - 1];
22     }
23     
24     public static void main(String args[]){
25         for (int i = 1; i < 21; i++) {
26             System.out.print(nthUglyNumber(i) + " ");
27         }
28     }
29 }

输出:

1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 

输出了前20个ugly number

目录
相关文章
【npm】解决:bat脚本中无法连续执行npm的问题
【npm】解决:bat脚本中无法连续执行npm的问题
927 0
|
存储 算法 C语言
【C++入门到精通】C++入门 —— priority_queue(STL)优先队列
本文介绍了C++的STL组件`std::priority_queue`,它是一个容器适配器,实现优先队列数据结构,通常基于堆实现。文章讨论了优先队列的基本概念、特点和底层堆结构,强调了其自动排序和优先级最高元素的访问。还展示了如何定义、插入、访问和移除元素,以及自定义比较函数。此外,提供了模拟实现`priority_queue`的代码示例,探讨了仿函数的作用,包括默认的`std::less`和自定义比较函数。文章鼓励读者进一步探索C++的优先队列及其应用。
512 3
|
7月前
|
编解码 运维 Linux
2025远程控制软件综合测评:跨平台、低延迟与画质谁更胜一筹
2025年远程控制软件:从性能、画质、功能到跨平台体验,全面解析连连控等主流工具。连连控凭4K/165FPS高帧率、低延迟、屏幕墙批量管理及纯净无广告设计,成专业用户首选,助力远程办公与IT运维高效协同。
|
10月前
|
人工智能 监控 API
API即生产力:电商行业如何用“数字接口”重构竞争壁垒?
电商API作为连接平台、商家、物流与支付的“数字钥匙”,正系统性破解数据孤岛、运营低效、决策滞后与体验断层等传统电商痛点。通过数据实时同步、流程自动化、智能分析与服务闭环,API助力企业提升效率、优化决策、增强用户体验,并推动全行业向智能化、数字化跃迁。
|
人工智能 架构师 Java
传智教育引通义灵码进课堂,为技术人才教育学习提效
7 月 17 日,阿里云与传智教育在阿里巴巴云谷园区签署合作协议,双方将基于阿里云智能编程助手通义灵码在课程共建、品牌合作及产教融合等多个领域展开合作,共同推进 AI 教育及相关业务的发展,致力于培养适应未来社会需求的高素质技术人才。
|
JavaScript Java 测试技术
基于小程序的个人健康数据管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的个人健康数据管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
327 0
|
弹性计算 应用服务中间件 定位技术
基于地理位置的访问策略的GA加速最佳实践
全球加速GA是阿里云提供的全球网络加速服务,支持基于地理位置的访问策略。本文介绍如何通过多组GA实例组合,实现一个域名在全球多个区域的服务同步加速。具体步骤包括创建ECS实例、部署Nginx服务器、配置GA及全局流量管理器等。
597 4
|
移动开发 API UED
【专栏:HTML进阶篇】HTML5拖放API与触摸事件
【4月更文挑战第30天】HTML5的拖放API和触摸事件增强了网页交互设计,使开发者能创建动态响应式界面。拖放API通过设定元素的`draggable`属性、监听拖动和放置事件以及处理`DataTransfer`对象实现。触摸事件如`touchstart`、`touchmove`、`touchend`则让触控设备操作更流畅。开发者需注意事件对象、多点触控处理和防止默认行为。结合两者,可创建图片排序、手势识别等交互功能,但也需面对浏览器兼容性和复杂逻辑挑战。利用HTML5这些工具,能提升用户体验,推动网页交互设计创新。
648 0
|
前端开发 JavaScript 测试技术
《小团队web技术搭建》(七)自动化部署方式(CI/CD)(二)
《小团队web技术搭建》(七)自动化部署方式(CI/CD)(二)
626 1
|
项目管理 智能硬件 测试技术
带你读《天猫精灵:如何在互联网公司做硬件》——天猫精灵发展史
带你读《天猫精灵:如何在互联网公司做硬件》——天猫精灵发展史
带你读《天猫精灵:如何在互联网公司做硬件》——天猫精灵发展史