JAVA面试算法题3

简介:

题目:

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5


代码

这题目很简单,首先根据输入整数,列出所有小于此整数的素数列表,这些素数都有可能作为被分解整数的因子,然后从最小的素数开始,让被分解的数去除这个数,如果整除,那么此素数就作为因子,然后递归到用分解 原数/当前素数,如果不能整除,那么从候选素数中移除当前的最小素数,挑选下一个素数再尝试,最后所有的因子都被记录在列表中,最后打印出来。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package  com.charles.algo;
import  java.util.ArrayList;
import  java.util.List;
/**
  * @author charles.wang
  *
  * 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
  *
  */
public  class  DecompositeToFactor {
     // 这个factorList存放了最终被分解的质因数列表
     private  static  List<Integer> factorList =  new  ArrayList<Integer>();
     // 这个availablePrimeFactorList用于存放所有不超过被分解的数的素数列表,他们中的每个将从小到大依次拿去尝试
     private  static  List<Integer> availablePrimeFactorList;
     /**
      * 判断一个数是否是素数,判断的方法是用2,3,4..一直到 sqrt(number)的值去作为除数,
      * 让number去除这些值,如果能整除,说明这个数不是素数
      *
      * @param number
      * @return
      */
     private  static  boolean  isPrime( int  number) {
         // 1不是素数
         if  (number ==  1 )
             return  false ;
         // 判断一个数是否是素数,判断的方法是用2,3,4..一直到 sqrt(number)的值去作为除数,
         // 让number去除这些值,如果能整除,说明这个数不是素数
         for  ( int  i =  2 ; i <= Math.sqrt(number); i++) {
             if  (number % i ==  0 ) {
                 return  false ;
             }
         }
         return  true ;
     }
     /**
      * 返回一个素数列表,其中的每一个素数都不超过被测的值
      *
      * @param number
      * @return
      */
     public  static  List<Integer> makeAvailablePrimeFactorList( int  number) {
         List<Integer> availablePrimeFactorList =  new  ArrayList<Integer>();
         // 2是最小的素数,从2开始一直算到被测的数,如果此数为素数,则被添加到可用的素数列表中
         for  ( int  i =  2 ; i <= number; i++) {
             if  (isPrime(i))
                 availablePrimeFactorList.add(i);
         }
         return  availablePrimeFactorList;
     }
     /**
      * 分解质因数,这是一个递归调用
      *
      * @param number
      */
     private  static  void  decomposite( int  number) {
         // 如果当前数已经是素数,那么分解到头了,吧当前的素数也作为质因子
         if  (isPrime(number)) {
             factorList.add(number);
             return ;
         }
         // 如果当前可用素数列表中没有素数了,那么结束
         if  (availablePrimeFactorList.size() ==  0 )
             return ;
         // 当前可用素数列表中的最小素数
         int  currentPrime = availablePrimeFactorList.get( 0 );
         // 如果number被当前素数整除,那么吧当前素数添加到factor列表中,更新待分解的数为 number/currentPrime
         if  (number % currentPrime ==  0 ) {
             factorList.add(currentPrime);
             decomposite(number / currentPrime);
         }
         // 如果number不可以被当前素数整除,那么从可用素数列表中移除当前的素数,从下一个素数开始
         else  {
             availablePrimeFactorList.remove( 0 );
             decomposite(number);
         }
     }
     /**
      * @param args
      */
     public  static  void  main(String[] args) {
         // 被分解的数
         int  number =  78 ;
         // 获得所有小于被分解的数的素数的列表
         availablePrimeFactorList = makeAvailablePrimeFactorList(number);
         // 分解质因数
         decomposite(number);
         // 打印出所有的质因子,这些质因子来自factorList
         System.out.print(number +  "=" );
         for  ( int  i =  0 ; i < factorList.size(); i++) {
             System.out.print(factorList.get(i));
             if  (i < factorList.size() -  1 )
                 System.out.print( "*" );
         }
     }
}


比如,我这里测试78,那么显示:

141658380.png





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1345641,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
269 35
|
2月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
5月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
338 1
|
4月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
455 0
|
1月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
4月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
234 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
2月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
4月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
77 4

热门文章

最新文章