java 质因数分解
2021/5/23 20:25:30
本文主要是介绍java 质因数分解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
import java.util.TreeSet; import java.util.List; import java.util.Arrays; import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; import java.util.stream.Collectors; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; import java.io.LineNumberReader; import java.io.FileWriter; import java.io.BufferedWriter; /** * @Author:Administrator * @Date:2021-05-23 */ public class Factorization { /** 质数海*/ public static TreeSet<Long> primePoor = new TreeSet(); /** 最小质数*/ private static final long MIN_FAC = 2L; /** 质数缓存*/ private static String filename = "prime.txt"; /** 文件路径*/ private static String filepath; /** 分隔符*/ private static String delimiter = ","; /** 每行数字*/ private static Integer cols = 10; static { //初始化池, 100以内的质数 Long[] prime25 = {2L,3L,5L,7L,11L,13L,17L,19L,23L,29L,31L,37L,41L,43L,47L,53L,59L,61L,67L,71L,73L,79L,83L,89L,97L}; filepath = Factorization.class.getResource("/").getPath(); // System.out.println("\n类路径:"+path); File file = new File(filepath, filename); List<Long> prime = new ArrayList(Arrays.asList(prime25)); // for(int i=0; i<prime25.length; i++){ // prime.add(prime25[i]); // } if(file.exists()){ String str = FileUtil.read(file.getPath()); if(str != null && !"".equals(str)){ String[] strArr = str.split(delimiter); prime = (List<Long>)new ArrayList(Arrays.asList(strArr)).stream().map(it -> Long.parseLong((String)it)).collect(Collectors.toList()); } } // prime.forEach(System.out::println); for(int i=0;i<prime.size();i++){ primePoor.add(prime.get(i)); } } public static void main(String[] args){ Scanner sc = null; try { sc = new Scanner(System.in); long a = 2L; while(a>1){ System.out.println("\n请输入待分解的自然数:"); a = sc.nextLong(); System.out.println(fact(a)); } int size = primePoor.size(); System.out.println("退出...\n"); StringBuilder sb = new StringBuilder(); for(int i=0;i<size;i++){ sb.append(primePoor.pollFirst()); if(i<size-1){ sb.append(delimiter); } if((i+1) % cols==0){ sb.append("\r\n"); } } // File file = new File(filepath, filename); FileUtil.write(sb.toString(), filepath + filename); } catch (Exception e) { // System.out.println("error"); e.printStackTrace(); } finally { if(sc!=null) { try { sc.close(); } catch (Exception ec) { System.out.println("close scanner error"); } } } } /** * */ public static String fact(long a){ List<Long> arr = factArr(a); return arr.stream().map( it -> it + "").collect(Collectors.joining("*")); } /** * 分解结果 */ public static List<Long> factArr(long a){ List<Long> res = new ArrayList(); if( a <= MIN_FAC){ res.add(a); return res; } long begin = MIN_FAC; while(!isPrime(a)){ if(a%begin==0){ a /= begin; res.add(begin); } else{ begin = nextPrime(begin); } } res.add(a); return res; } /** * 下一个质数 */ public static long nextPrime(long a){ if(a<MIN_FAC) return MIN_FAC; ++a; Long res = (Long)primePoor.ceiling(a); if(res != null) return res; while(true){ res = a; if(isPrime(res)){ return res; } a++; } } /** * 判断是否是质数 */ public static boolean isPrime(long a){ if (a<MIN_FAC) return false; if(primePoor.contains(a)) return true; long i=2L; double limit = Math.ceil(Math.sqrt(a)); for(Iterator iter = primePoor.iterator(); iter.hasNext(); ) { i = (Long)iter.next(); if(a%i==0){ return false; } } i++; while (i<=limit) { if(a%i==0){ return false; } if(i<1000000 && isPrime(i)){ primePoor.add(i); } i++; } primePoor.add(a); return true; } /** * 绝对值 */ public static long abs(long a){ long i = a >> 3; return ((a^i)-i); } } class FileUtil { /** * 读取文本内容 */ public static String read(String filepath){ File file = new File(filepath); if (!file.exists()){ try { file.createNewFile(); } catch (Exception e){ e.printStackTrace(); } return ""; } StringBuilder content = new StringBuilder(); String s; BufferedReader br = null; try { br = new BufferedReader(new FileReader(file)); while ((s =br.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格 content.append(s); } } catch(Exception e){ e.printStackTrace(); } finally { if(br != null){ try { br.close(); } catch (Exception e1) { e1.printStackTrace(); } } } return content.toString(); } /** * 读取文件指定行数(读取多行) * @param filePath * @param max 读取行数 * @param page 第几个 max */ public static String read(String filePath,int max, int page){ FileReader fr = null; page = page > 0 ? page : 1; max = max > 0 ? max : 30; LineNumberReader reader = null; StringBuilder res = new StringBuilder(); try { fr = new FileReader(filePath); reader = new LineNumberReader(fr); int i = 0, b = (page-1) * max, e = page * max; String s = null; while((s = reader.readLine()) != null){ if(b <= i++ && i< e){ res.append(s); } } } catch (Exception e) { e.printStackTrace(); } finally { closeResource(fr, reader); } return res.toString(); } /** 写*/ public static boolean write(String content, String filepath){ File file =new File(filepath); if(!file.exists()){ try { file.createNewFile(); } catch (Exception e){ e.printStackTrace(); } } BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(file)); bw.write(content); return true; } catch (Exception e) { e.printStackTrace(); } finally { if (bw != null){ try { bw.close(); } catch (Exception e1) { e1.printStackTrace(); } } } return false; } /** * 关闭资源 * @param fr * @param reader */ static void closeResource(FileReader fr,LineNumberReader reader){ try { if(reader != null){ reader.close(); } if(fr != null){ fr.close(); } } catch (Exception e) { e.printStackTrace(); } } }
这篇关于java 质因数分解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27JavaScript面试真题详解与解答
- 2024-12-27掌握JavaScript大厂面试真题:新手入门指南
- 2024-12-27JavaScript 大厂面试真题详解与解析
- 2024-12-26网络攻防资料入门教程
- 2024-12-26SQL注入资料详解:入门必读教程
- 2024-12-26初学者指南:数据库服务漏洞项目实战
- 2024-12-26网络安全项目实战:新手入门指南
- 2024-12-26网络攻防项目实战入门教程
- 2024-12-26信息安全项目实战:从入门到初步应用
- 2024-12-26SQL注入项目实战:初学者指南