算法目的:对一个正整数分解质因数

一、算法分析:

1、建立整数列表,保存求到的因数。

2、声明整数i=2,用以递增取模;整数m,用于临时保存n

3、建立while循环,i小于等于整数m时,判断m%i,如果等于0,可以被整除,则令 m = m/i 将 i添加到 整数列表;如果m%i不等于0,i++

4、判断整数列表长度,如果长度为1,则认定n是质数;否则为合数并打印列表

5.加入n的开方值比较,如果i 递增到n的开方值但整数列表的大小仍为0,则认为此数是质数

二、运算结果抢先看

三、基础程序

package fundamental;

import java.util.ArrayList;
import java.util.List; public class Seperate { public static void main(String[] args) {
getZ(102039);
}
/*
对n分解质因数,首先找到最小质因数k,如果k==n,直接打印退出。
n<>k,继续k+1对n进行分解
*/
public static void getZ(int n){
List<Integer> l = new ArrayList<Integer>();
int i = 2,m = n;
long start = System.currentTimeMillis();
while(i<=m){ // i<=m 与 i<=n 在运算合数时,效率差很多
if(m%i==0){
m=m/i;
l.add(i);
}else i++;
}
long end = System.currentTimeMillis();
// 0x7fffffff 是 质数,所以i值会累加到 0x7fffffff,比较耗时。但不会超过9秒,因为i值最多累加到0x7fffffff
// 运算时长与n值大小无关,与最大因数有关。
// 最大因数越大,运算越慢,反之越快。
System.out.println("用时:"+(end-start)+"毫秒"); if(l.size()==1) System.out.println(n+"是质数");
else System.out.println(l.toString());
}
}

四、优化算法

加入开方值比较,减少时间复杂度

package fundamental;

import java.util.ArrayList;
import java.util.List; public class Seperate { public static void main(String[] args) {
getZ(0x7fffffff);
}
/*
对n分解质因数,首先找到最小质因数k,如果k==n,直接打印退出。
n<>k,继续k+1对n进行分解
*/
public static void getZ(int n){
List<Integer> l = new ArrayList<Integer>();
int i = 2,m = n;
long start = System.currentTimeMillis();
// sqrt 用以减少比较时间
int sqrt = (int) Math.sqrt(n);
while(i<=m ){ // i<=m 与 i<=n 在运算合数时,效率差很多
if(m%i==0){
m=m/i;
l.add(i); }else i++; /*
以下一行是优化算法:
如果 i 超过 sqrt 还没有因数存在,则认为是质数,跳出循环
因为 n 如果是两个质数的乘积,i值需要递增到sqrt才能判断出n是否为质数
*/
      if(i>sqrt) {
          if(l.size()==0) System.out.println(n+"是质数");
          else l.add(m);
          break;
       }
}
long end = System.currentTimeMillis(); // 0x7fffffff 是 质数,所以i值会累加到 0x7fffffff,比较耗时。但不会超过9秒,因为i值最多累加到0x7fffffff
// 运算时长与n值大小无关,与最大因数有关。
// 最大因数越大,运算越慢,反之越快。
System.out.println("用时:"+(end-start)+"毫秒"); if(l.size()==0) System.out.println(n+"是质数");
else System.out.println(l.toString());
}
}

java 分解质因数的更多相关文章

  1. java分解质因数

      package test; import java.util.Scanner; public class Test19 { /** * 分析:对n进行分解质因数,应先找到一个最小的质数k * 最小 ...

  2. java 分解质因数 基础增强

    题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 为了熟悉加强基础练习,搞搞经典小demo..话不多说,直接贴代码,看注释.package www.test;import j ...

  3. java分解质因数,具体程序分析和代码

    题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 将一个正整数分解质因数分析:对n进行分解质因数,找到最小的质数k如果这个质数恰好等于n则说明分解质因数过程已经结束,打印输出 ...

  4. java求最大公约数(分解质因数)

    下面是四种用java语言编程实现的求最大公约数的方法: package gcd; import java.util.ArrayList; import java.util.List; public c ...

  5. Java经典案例之-“分解质因数”

    /** * 描述:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * 分析: * 对n进行分解质因数,应该先找到一个最小的质数k,然后按照下列步骤进行: * (1)如果这个质数恰 ...

  6. java从键盘输入数,分解质因数,

    总结:1.break;的用法 当最小质因数不能被输入的值整除时,需要继续循环.k++. 当然输入的数,本身就是质数时,那么 package com.b; import java.util.Scanne ...

  7. java代码分解质因数

    总结: 循环...首位 逻辑要清晰 很简单.首先质因数最小的2.因为1不是质数 然后当输入的数刚好为2时,结束.不用下一步了.否则在循环里不停的输出一个数, 当输入的数比2大时,分能被2整除和不能被2 ...

  8. Java基础50题test4—分解质因数

    [分解质因数] 题目:将一个正整数分解质因数.例如:输入 90,打印出 90=2*3*3*5. 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰 ...

  9. JAVA 基础编程练习题4 【程序 4 分解质因数】

    4 [程序 4 分解质因数] 题目:将一个正整数分解质因数.例如:输入 90,打印出 90=2*3*3*5. 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1) ...

随机推荐

  1. PHP秒杀系统-高并发高性能的极致挑战

    慕课网实战教程后端:1.java c++算法与数据结构2.java Spring Boot带前后端 渐进式开发企业级博客系统3.java Spring Boot企业微信点餐系统4.java Sprin ...

  2. SQL Count(*)函数,GROUP_By,Having的联合使用

    COUNT(*)  函数返回在给定的选择中被选的行数. 语法:SELECT  COUNT(*) FROM  table 使用:现在有一个表,名叫app_category,从Navicat中可以看到表中 ...

  3. HDU 1014 Uniform Generator 欧几里得

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1014 解题思路: 1. 把题目意思读懂后,明白会输入两个数,然后根据题中的公式产生一系列伪随机数,看这 ...

  4. php中trait

    1.简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使 ...

  5. 《重构--改善既有代码的设计》总结or读后感:重构是程序员的本能

    此文写得有点晚,记得去年7月读完的这本书,只是那时没有写文章的意识,也无所谓总结了,现在稍微聊一下吧. 想起写这篇感想,还是前几天看了这么一篇文章 研究发现重构软件并不会改善代码质量 先从一个大家都有 ...

  6. Codeforces Round #313 (Div. 2) C

    题目链接 题意:  有一个六边形,给你6条边的长度(顺时针给出).每条边都是整数,问你它能够被切割成几个单位长度的正三角形  (题目保证给出的数据能够被切割) 思路: 六边形能够被切割成两种情况: ① ...

  7. RT5350的uvc驱动支持yuv格式摄像头成功

    请尊重别人的劳动成果 转载请务必注明出处 今天在rt5350的板子上,成功将仅仅支持yuv格式的usb camera摄像头执行了.採用的是mjpeg streamer ,须要libjpeg库支持yuv ...

  8. 在Visual Studio Code中开发Office Add-in

    作者:陈希章 发表于 2017年7月13日 上一篇 我介绍了如何在Visual Studio中开发Office Add-in,因为有标准的项目模板,一系列配套的工具,尤其是自带的一键调试功能,可以让开 ...

  9. websocket简单实例

    只需要两个文件即可,一个服务端,一个前端,一下示例为模拟简单的聊天程序: 服务端: package com.test.websocket; import java.io.IOException; im ...

  10. MFC中应用对象的成员:窗口指针m_pMainWnd说明

    CVC_MFC_firstDlg dlg; //定义对话框对象m_pMainWnd = &dlg;  //这个定义的对话框 dlg 成为主窗口 应用程序对象成员变量m_pMainWnd是一个窗 ...