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求一个数的因子相关推荐

  1. 求一个数的因子个数/因子和/质因子 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== ...

  2. python求合数的所有因子,0是素数吗(python求一个数的因子)

    相信很多人对于0是素数吗(python求一个数的因子)并不是非常的了解,因此小编在这里为您详解的讲解一下相关信息! 0和1不是质数,因为质数的定义是:在大于1的自然数中,除了1和它本身以外不再有其他因 ...

  3. Java求三个数的最小公倍数算法改进(化境)

    之前在<Java求3个数的最小公倍数LCM,要求LCM小于11亿时计算结果正确(在CPU性能小于1.8GHz的情况下)>一文中"避免了之前的算法最大计算量的情况"(相对 ...

  4. java求两个数的平均值-这么简单我竟然不会?

    背景:结合上篇的java位运算,突发奇想,特此总结,如何正确的求2个数的平均值,通过本片文章也让你们认识到bug是如何深埋在你的编程中的. 备注:以int计算为例. 1  通用写法 public st ...

  5. Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数

    今天参加腾讯笔试,做编程题时在最小公倍数.最大公约数这些这么简单的知识点上卡壳了,自信心受到强烈的打击,下来后猛复习了这方面的相关编程知识. 有以下几个关键点: 1.任意正整数的最大公约数.最小公倍数 ...

  6. 求n个数的公倍数java,求N个数的最小公倍数 - osc_n6euf5h6的个人空间 - OSCHINA - 中文开源技术交流社区...

    题目描述 求n(n <= 50)个数的最小公倍数. 输入 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. 输出 为每组测试数据输出它们的最小公倍数,每个测试实例的输出 ...

  7. python求一个数的因子_Python 最大公约数算法

    #13 HaydnLiao Hay***iao@163.com 27 可按以下思路减少循环次数: 1. 当最小值为最大公约数时,直接返回: 2. 当最小值不为最大公约数时,最大公约数不会大于最小值的1 ...

  8. java求两个数相加代码

    假定目前Java环境已经构建完成,然后在编辑器中输入如下一段代码,编译运行,即可实现从控制台输入两个整数,并对其求和将结果输出到控制台. import java.util.*; class Hello ...

  9. 数论:求一个数的因子专题(因子数,因子和,质因子)

    问题1-求n的因子数.因子和 输入一个正整数N,求出这个数字存在多少个因子,以及因子之和. 分析 既要求因子数,又要求因子和,因此我们要从1开始遍历一直到根号n,如果n%i==0,因子数+2,因子和要 ...

最新文章

  1. idea bookmark 怎么用
  2. 基于Springboot实现园区招商管理系统
  3. TableView/CollectionView 滑动顶部效果优化
  4. 什么是CPython
  5. MATLAB——nctoolbox安装及使用
  6. springboot 跨域配置cors
  7. Leet Code OJ 104. Maximum Depth of Binary Tree [Difficulty: Easy]
  8. 微信小程序 对request方法二次封装
  9. activemenu怎么拼 vue_vue-element-admin登录逻辑,以及动态添加路由,显示侧边栏
  10. 常用函数式接口-Function
  11. 关于python中自己写的模块之前相互调用函数
  12. Serializing - 序列化 综述 – To be continued.
  13. mysql手册05_存储过程和存储函数
  14. Unity3D游戏开发入门引导:Unity3D收费方案和版本、下载地址、安装教程
  15. caj 服务器正在运行中,紧急求助:caj阅读器打不开
  16. 结构化数据、半结构化数据、非结构化数据的对比
  17. 洛谷P1757 通天之分组背包
  18. 树(前序,中序,后序)
  19. 将Windows驱动程序从一台计算机复制到另一台计算机
  20. vue项目 element表格数据行转列数据互转

热门文章

  1. (十一)在线编辑模块(FreeTextBox插入图片,内容保存到数据库)
  2. 浦东新区企业研发机构认定奖励50万政策解读
  3. 小程序实现附近三公里搜索和地图路线导航(改版)
  4. uniapp 移动端 两种横竖屏切换方案
  5. 怎样绘制英语学习思维导图?简单的方法介绍
  6. kali httrack-网站克隆工具
  7. qq和微信收不到新邮件提醒
  8. 大学英语Ⅱ unit 1(第五题)
  9. Joomla!模板如何工作
  10. Joomla 节日派对产品展示模板