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. Java常用类之String类练习

    1.编程. 已知字符串:"this is a test of java". 按要求执行以下操作: (1) 统计该字符串中字母s出现的次数 (2) 取出子字符串"test& ...

  2. Centos 执行shell命令返回127错误

    shell脚本功能:连接mysql,自动创建数据库,脚本如下 mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASSWORD --default-character ...

  3. fetch()的用法

    发起获取资源请求的我们一般都会用AJAX技术,最近在学习微信小程序的时候,用到了fetch()方法. fetch()方法用于发起获取资源的请求.它返回一个promise,这个promise会在请求响应 ...

  4. [0] JAVABEAN & JAVASERVLET

    Servlet技术是Sun公司提供的一种实现**页的解决方案,它是基于Java编程语言的WEB服务器端编程技术.Servlet技术也是Jsp技术的基础.一个Servlet程序就是一个实现了特殊接口的J ...

  5. SICIP-1.3-Defining a new function

    定义函数 def <name> (former parament): 函数体(缩进) 环境 全局环境 局部环境 只在函数内部有效 TIP 函数体只在调用的最后执行 抽象化函数 函数域(函数 ...

  6. [项目记录]一个.net下使用HAP实现的吉大校园通知网爬虫工具:OAWebScraping

    第一章 简介 本文主要介绍了在.NET下利用优秀的HTML解析组件HtmlAgilityPack开发的一个吉林大学校内通知oa.jlu.edu.cn的爬取器.尽管.Net下解析HTML文件有很多种选择 ...

  7. IDEA报错处理:Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:8080

    把wildfly的整个软件包更换成新的,配置文件重新配置,JBOSS_HOME环境变量修改成新的,在wildfly-10.1.0.FinalForTest\modules\system\layers\ ...

  8. vmware克隆虚拟机后网卡名称及网络地址xiuf

    使用vmware克隆虚拟机后,若原主机网卡名称为eth0,那么克隆后的主机使用ifconfig查看仅能看到一个名称为eth1的网卡 并且在/etc/sysconfig/network-scripts/ ...

  9. 【从零开始】用node搭建一个jsonp&json服务

    目录: 一.介绍 二.node安装 三.webstorm配置node环境 四.代码介绍 五.如何使用 六.自定义域名 七.其他 一.介绍 1.背景     日常工作中,跟后端商定好接口格式后:通常采用 ...

  10. C/C++中的volatile究竟是什么鬼?

    将变量或对象声明为volatile类型后,每次对变量的访问都是从其内存直接读取.那什么时候对变量的访问不是从其内存读取的呢?一种常见的情况就是编译器开启了优化选项,这时候对变量的访问有可能就是从寄存器 ...