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;直到完成判断

 /**
  * Ugly number1
  * @author Rust Fisher
  * Judge the number whether ugly
  */
 public class UglyNumber1 {
     public static boolean hasDigit(double d){
         return  d*10%10 != 0;
     }
     /**
      * @param num
      * @return boolean whether num is ugly
      */
     public static boolean isUgly(int num) {
         if (num <= 0) {
             return false;
         }
         if (num == 1) {
             return true;
         }
         if (!hasDigit(num/2.0)) {
             if (isUgly(num/2)) {
                 return true;
             }
         }
         if (!hasDigit(num/3.0)) {
             if (isUgly(num/3)) {
                 return true;
             }
         }
         if (!hasDigit(num/5.0)) {
             if (isUgly(num/5)) {
                 return true;
             }
         }

         return false;
     }
     /**
      * Find the nth ugly number
      * @param n
      * @return the nth ugly number
      */
     public static int nthUglyNumber(int n) {
         if (n <= 0) {
             return -1;
         }
         int count = 0;
         int i = 0;
         while (count <= n){
             if (isUgly(i)) {
                 count++;
             }
             if (count == n) {
                 break;
             }
             i++;

         }
         return i;
     }

     public static void main(String args[]){
         int count = 0;
         for (int i = 0; i < 100; i++) {
             if (isUgly(i)) {
                 count++;
                 System.out.print(i + "\t");
             }
             if (count == 10) {
                 count = 0;
                 System.out.println();
             }
         }
         System.out.println("\nThe n-th ugly numbers : ");
         count = 0;
         for (int i = 1; i < 21; i++) {
             System.out.print(nthUglyNumber(i) + "  ");
         }
         System.out.println("\n用这种方式输出第n个ugly number很没效率");
     }
 }

输出:

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加一

 public class UglyNumber2{
     public static int getMin(int a,int b,int c){
         int min = a < b ? a : b;
         return min < c ? min : c;
     }
     public static int nthUglyNumber(int n) {
         if (n < 1) {
             return -1;
         }
         int index2 = 0, index3 = 0, index5 = 0;  //  three index
         int[] uglyNums = new int[n];
         uglyNums[0] = 1;
         int next = 1;
         while (next < n) {
             uglyNums[next] = getMin(uglyNums[index2]*2,uglyNums[index3]*3,uglyNums[index5]*5);
             if (uglyNums[next] == uglyNums[index2]*2) index2++;// find out which index should move
             if (uglyNums[next] == uglyNums[index3]*3) index3++;// index moving forward
             if (uglyNums[next] == uglyNums[index5]*5) index5++;
             next++;
         }
         return uglyNums[next - 1];
     }

     public static void main(String args[]){
         for (int i = 1; i < 21; i++) {
             System.out.print(nthUglyNumber(i) + " ");
         }
     }
 }

输出:

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

输出了前20个ugly number

UglyNumber - 找“丑数”的更多相关文章

  1. 剑指offer系列59---寻找丑数

    [题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...

  2. 4 丑数 Ⅱ-找出第n个丑数

    原题网址:http://www.lintcode.com/zh-cn/problem/ugly-number-ii/ 设计一个算法,找出只含素因子2,3,5 的第 n 小的数. 符合条件的数如:1, ...

  3. 剑指offer-第5章优化时间和空间效率(丑数)

    题目:我们把只包含因子2,3,5的数叫做丑数.寻找第1500个丑数.通常把1当成第一个丑数. 思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除.通过求余数是否为零 ...

  4. 37.寻找丑数[Ugly numbers]

    [题目] 我们把只包含质因子2.3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑 ...

  5. 洛谷P2723 丑数 Humble Numbers

    P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数 ...

  6. lintcode :Ugly Numbers 丑数

    题目 丑数 设计一个算法,找出只含素因子3,5,7 的第 k 大的数. 符合条件的数如:3,5,7,9,15...... 样例 如果k=4, 返回 9 挑战 要求时间复杂度为O(nlogn)或者O(n ...

  7. 剑指OFFER之丑数(九度OJ1214)

    题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...

  8. 丑数 LeeTCode

    题目链接:http://www.lintcode.com/zh-cn/problem/ugly-number-ii/ 题目描述:设计一个算法,找出只含素因子2,3,5 的第 n 大的数.符合条件的数如 ...

  9. Humble Numbers(丑数) 超详解!

    给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑 ...

随机推荐

  1. INFORMATION_SCHEMA.PROFILING

    24.18 The INFORMATION_SCHEMA PROFILING Table PROFILING表提供了语句分析信息. 其内容对应于SHOW PROFILES和SHOW PROFILE语句 ...

  2. Hadoop SSH+IP、SSH+别名 免密登录配置

    1.为什么要进行 SSH 无密码验证配置? Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个Da ...

  3. 使用SQL语句使数据从坚向排列转化成横向排列(排班表)

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...

  4. Docker-compose实战——Django+PostgreSQL

    今天我们来用docker-compose 快速安装一个Django+PostgreSQL的开发环境. Compose简介 Compose 定位是“defining and running comple ...

  5. 自己积累写的winfrom 操作api 类

    引用 类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  6. angularjs下拉框实现渲染html

    angualrjs处于安全的考虑,插值 指令会对相应字符串进行过滤,避免出现html攻击.但是在一些时候,我们需要渲染html,比如实现一个分级的下拉框,代码如下: <body ng-app=& ...

  7. sed的用法

    1.什么是sed sed命令是一个流线式.非交互式编辑器,可以实现在vi等编辑器中一样的编辑效果.   2.sed的工作原理 模式空间(pattern space) sed一次处理一行文本(或输入), ...

  8. 开始学习机器学习,从Ng的视频开始

    时隔开5个月,忙完了考研和毕设后终于有时间搞自己想搞得,研究生导师方向是图像处理与机器学习结合,重新开工 何为机器学习? 对于机器学习(Machine Learning)的定义大体上有两种,第一种是美 ...

  9. vue组件大集合 component

    vue组件分为全局组件.局部组件和父子组件,其中局部组件只能在el定义的范围内使用, 全局组件可以在随意地方使用,父子组件之间的传值问题等. Vue.extend 创建一个组件构造器 template ...

  10. oracle删除数据后表空间仍过大问题解决方法

    -----亲测有效------- --一.备份原始数据库库--1.备份空表--在plsql里面执行一下这句话 然后把结果集 再执行一把 再导数据select 'alter table '||table ...