一、题目大意

本题要求写出前1500个仅能被2,3,5整除的数。

二、题解

最初的想法是从1开始检验该数是否只能被2,3,5整除,方法是这样的,对于一个数,如果它能被2整除,就除以2,如果它能被3整除,就除以3,如果它能被5整除,就除以5,直到不能被2,3,5整除,看结果是不是1,如果是1就满足条件,否则不满足条件。但是第1500个数大约近10亿,显然是1s内不可以完成的。
然后仔细分析发现:满足条件的数是2^x*3^y*5^z,可以转换为这样的定义,定义一个集合,该集合中有元素1,如果x在集合中,那么2x,3x,5x也在集合中,其它数不再集合中。我们可以定义一个bool数组,初始化为false,从1开始设置为true,如果x为true,则2x,3x,5x设置为true,直到获得1500个true即可,典型的空间换时间的做法,但是这个空间也太大了!这个数组要开到近10亿才可以,显然是不可行的,内存用完了,可能都不够用。
顺着这个思路继续想下去,定义一个集合,该集合中有元素1,如果x在集合中,那么2x,3x,5x也在集合中,其它数不再集合中。按照这个思路走下去:只需要定义一个结果数组,和3个指针,分别代表待乘2的数,待乘3的数,待乘5的数,

1
*2
*3
*5
选出乘积最小的,加入到结果集中,相应指针右移
1     2
*3   *2
*5
选出乘积最小的,加入到结果集中,相应指针右移
1    2     3
*5   *2
     *3
选出乘积最小的,加入到结果集中,相应指针右移
1    2     3     4
*5   *3     *2
选出乘积最小的,加入到结果集中,相应指针右移
1     2      3     4
   *3     *2
      *5
以此类推,直到获得1500的结果集。

参考:

三、java代码

import java.util.Scanner;

public class Main { 

    public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n;
int i2_mul;
int i3_mul;
int i5_mul;
long[] ugly=new long[1501]; i2_mul = 1;
i3_mul = 1;
i5_mul = 1;
ugly[1]=1; for( int i = 2; i <= 1500; i++ ){
ugly[i] = Math.min(ugly[i2_mul]*2,Math.min(ugly[i3_mul]*3,ugly[i5_mul]*5));
if(ugly[i] == ugly[i2_mul]*2 )
i2_mul++;
if(ugly[i] == ugly[i3_mul]*3 )
i3_mul++;
if(ugly[i] == ugly[i5_mul]*5)
i5_mul++;
} while((n=sc.nextInt())!=0){
System.out.println(ugly[n]);
}
}
}

最新文章

  1. bind绑定参数
  2. First,FirstOrDefault,Single,SingleOrDefault的区别
  3. C语言解决八皇后问题
  4. paip.解决问题Unable to access jarfile E:\resin-4.0.22\lib\resin.jar
  5. Ajax的实现
  6. java笔试三
  7. 深入分析Php处理浮点数的问题
  8. CentOS7 查看ip
  9. HTTP请求WebTool
  10. C# 程序集安装与卸载
  11. 开发 | 微信小程序API-wx.setScreenBrightness/wx.getScreenBrightness
  12. vue 过滤器 基本用法
  13. bootcamp分区_BOOTCAMP 删除分区失败
  14. SQL Server 数据库部分常用语句小结(一)
  15. NLog 配置
  16. css文件 如何使背景图片大小适应div的大小
  17. C点滴成海------Ubuntu怎么运行C语言
  18. Linux进程学习 - 孤儿进程和守护进程
  19. MegaCli 监控raid状态 限戴尔服务器
  20. C++ 类的两种定义方式

热门文章

  1. GTK+重拾--07 GTK+中的事件
  2. python cookbook第三版学习笔记十五:property和描述
  3. 使用parted 对大容量盘进行分区
  4. ALV行 列颜色设置
  5. linux 基础-变量,shell基本语法
  6. R语言set.seed()函数介绍
  7. python基础13 ---函数模块3(正则表达式)
  8. VMware下所有的系统网卡启动不起来
  9. ubuntu vim退出时出错
  10. linux下安装telnet(centos7)