java求一个数的因子
java算一个数的所有因子。
最简单粗暴的方法:从1遍历到num,如果能被num整除,就是num的因子。
//该方法传入两个参数。一个是num(求num的因子);一个是arr数组,用来存放num的因子public static void fun1(int num,ArrayList<Integer> arr){for ( int i = 1 ; i <= num ; i++ ){if ( num % i == 0 ){arr.add(i); //将因子存放到arr数组中}}}
显而易见,当num的值较小的时候,该方法非常简单。但是,如果num非常的大,那么,这个算法的时间是非常久的。
我们来测试一下,当num的值为999999999(9位数)时,程序用时大概1650毫秒。已经大于1秒钟,产生肉眼可见的延迟。
int num = 999999999;
ArrayList<Integer> arr = new ArrayList<>();long startTime = System.currentTimeMillis(); //开始
fun1(num,arr);
long endTime = System.currentTimeMillis(); //结束System.out.println(endTime - startTime);
所以刚刚的算法肯定是不行的。那么优化后的算法如下:
public static void fun(int num,ArrayList<Integer> arr){//从1遍历到num的平方跟即可。//这时你可能会说,那后面的数呢,比如num本身,不是计算不到了嘛?//别急,看for循环里面的处理情况for ( int i = 1 ; i <= Math.sqrt(num) ; i++ ){//如果能被num整除,那肯定是num的因子,毫无疑问if ( num % i == 0 ){arr.add(i);//重点的部分在这里!!!//当i能被num整除的情况下,此时i是相对较小的因子,用i求出num另一个较大的因子n//因为当i能被num整除时,那么数"num/i"也一定能被num整除//不需要再进行重复的计算,这样算法的运行时间大大降低int n = num / i;//但用i算出另一个较大的因子时,会出现重复的情况//例如num = 4,当遍历到2时,算出另一个较大的因子也是2,这就重复了,要判断一下if ( n != i ){ arr.add(n);}}}}
我们再来试试这个算法的运行时间。差不多1毫秒,明显比上一个算法快非常多。
int num = 999999999;
ArrayList<Integer> arr = new ArrayList<>();long startTime = System.currentTimeMillis (); //开始
fun(num,arr);
long endTime = System.currentTimeMillis (); //结束System.out.println(endTime - startTime);
我们再来看看两个算法得到的因子是否相同:
写一个方法用于输出数组。
public static void printf(ArrayList<Integer> arr){Collections.sort(arr); //给因子从小到大排序,方便查阅for ( int i = 0 ; i < arr.size() ; i++ ){System.out.print(arr.get(i)+" ");}System.out.println("");}
主程序:
定义两个数组,数组arr存放优化算法得到的因子,数组arr1存放旧算法得到的数组。
int num = 999999999;ArrayList<Integer> arr = new ArrayList<>();
ArrayList<Integer> arr1 = new ArrayList<>();fun(num,arr);
printf(arr);fun1(num,arr1);
printf(arr1);
输出结果:
1 3 9 27 37 81 111 333 999 2997 333667 1001001 3003003 9009009 12345679 27027027 37037037 111111111 333333333 999999999
1 3 9 27 37 81 111 333 999 2997 333667 1001001 3003003 9009009 12345679 27027027 37037037 111111111 333333333 999999999
可以看到一模一样,所以说优化过后的算法是非常好的。而且,我在运行程序时,第一个数组arr(优化算法)的输出非常的快,肉眼无法捕捉。而第二个数组(旧算法)的输出延迟特别明显。
java求一个数的因子相关推荐
- 求一个数的因子个数/因子和/质因子 C/C++实现
求一个数的因子个数时间复杂度O√n ll get_number(ll x){ll num=0;for(ll i=1;i*i<=x;i++){if(x%i==0) num+=2; if(i*i== ...
- python求合数的所有因子,0是素数吗(python求一个数的因子)
相信很多人对于0是素数吗(python求一个数的因子)并不是非常的了解,因此小编在这里为您详解的讲解一下相关信息! 0和1不是质数,因为质数的定义是:在大于1的自然数中,除了1和它本身以外不再有其他因 ...
- Java求三个数的最小公倍数算法改进(化境)
之前在<Java求3个数的最小公倍数LCM,要求LCM小于11亿时计算结果正确(在CPU性能小于1.8GHz的情况下)>一文中"避免了之前的算法最大计算量的情况"(相对 ...
- java求两个数的平均值-这么简单我竟然不会?
背景:结合上篇的java位运算,突发奇想,特此总结,如何正确的求2个数的平均值,通过本片文章也让你们认识到bug是如何深埋在你的编程中的. 备注:以int计算为例. 1 通用写法 public st ...
- Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数
今天参加腾讯笔试,做编程题时在最小公倍数.最大公约数这些这么简单的知识点上卡壳了,自信心受到强烈的打击,下来后猛复习了这方面的相关编程知识. 有以下几个关键点: 1.任意正整数的最大公约数.最小公倍数 ...
- 求n个数的公倍数java,求N个数的最小公倍数 - osc_n6euf5h6的个人空间 - OSCHINA - 中文开源技术交流社区...
题目描述 求n(n <= 50)个数的最小公倍数. 输入 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. 输出 为每组测试数据输出它们的最小公倍数,每个测试实例的输出 ...
- python求一个数的因子_Python 最大公约数算法
#13 HaydnLiao Hay***iao@163.com 27 可按以下思路减少循环次数: 1. 当最小值为最大公约数时,直接返回: 2. 当最小值不为最大公约数时,最大公约数不会大于最小值的1 ...
- java求两个数相加代码
假定目前Java环境已经构建完成,然后在编辑器中输入如下一段代码,编译运行,即可实现从控制台输入两个整数,并对其求和将结果输出到控制台. import java.util.*; class Hello ...
- 数论:求一个数的因子专题(因子数,因子和,质因子)
问题1-求n的因子数.因子和 输入一个正整数N,求出这个数字存在多少个因子,以及因子之和. 分析 既要求因子数,又要求因子和,因此我们要从1开始遍历一直到根号n,如果n%i==0,因子数+2,因子和要 ...
最新文章
- idea bookmark 怎么用
- 基于Springboot实现园区招商管理系统
- TableView/CollectionView 滑动顶部效果优化
- 什么是CPython
- MATLAB——nctoolbox安装及使用
- springboot 跨域配置cors
- Leet Code OJ 104. Maximum Depth of Binary Tree [Difficulty: Easy]
- 微信小程序 对request方法二次封装
- activemenu怎么拼 vue_vue-element-admin登录逻辑,以及动态添加路由,显示侧边栏
- 常用函数式接口-Function
- 关于python中自己写的模块之前相互调用函数
- Serializing - 序列化 综述 – To be continued.
- mysql手册05_存储过程和存储函数
- Unity3D游戏开发入门引导:Unity3D收费方案和版本、下载地址、安装教程
- caj 服务器正在运行中,紧急求助:caj阅读器打不开
- 结构化数据、半结构化数据、非结构化数据的对比
- 洛谷P1757 通天之分组背包
- 树(前序,中序,后序)
- 将Windows驱动程序从一台计算机复制到另一台计算机
- vue项目 element表格数据行转列数据互转