最小公倍数 java
2013-10-30 02:37
239 查看
今天起床迟了,30多个小时的连续作战,睡个懒觉也无可厚非。。。
然后看到一个题目,一个很另类的记录整个求两个整数的最小公倍数的过程。于是小写了一下,发现过程中问题还不少,果然底层代码一段时间不写就生疏了。
先看两个简洁方法求最小公倍数
一最常用
两数之积 分别同时除以 两数,能同时除得整数的为公倍数,最小者为最小公倍数,当然,从最小数开始循环,第一个公倍数即为最小:
二:效率很高的写法
两数相乘除去两数中重复部分即可
三:模拟中学时代的最小公倍数求法
还记得吗,我们写两个数到一排,然后在左边分别写出两个数都有的部分,然后重复,最后把框框外的数相乘即为最小公倍数。
输出测试:
然后看到一个题目,一个很另类的记录整个求两个整数的最小公倍数的过程。于是小写了一下,发现过程中问题还不少,果然底层代码一段时间不写就生疏了。
先看两个简洁方法求最小公倍数
一最常用
两数之积 分别同时除以 两数,能同时除得整数的为公倍数,最小者为最小公倍数,当然,从最小数开始循环,第一个公倍数即为最小:
假定两个数分别为m,n if(m<n) { int t=m; m=n; n=t; } for(int i=n;i<=m*n;i++) { if(i%m==0 && i%n==0) { System.out.println("最小公倍数为"+i);break;} } //这是最常用的方法
二:效率很高的写法
两数相乘除去两数中重复部分即可
int minMultiple(int a, int b) { int r = a, s = a, t = b; if (a < b) { r = a; a = b; b = r; } while (r != 0) { r = a % b; a = b; b = r; } return s * t / a; }
三:模拟中学时代的最小公倍数求法
还记得吗,我们写两个数到一排,然后在左边分别写出两个数都有的部分,然后重复,最后把框框外的数相乘即为最小公倍数。
package calcumulation; import java.util.ArrayList; import java.util.Scanner; public class LCM { static int a; static int b; static ArrayList<Integer> primeNumber; public static void main(String [] args){ Scanner in = new Scanner(System.in); //note:I do not know what the size of your a and b , //so I am just give you the prime number that less than 100,you can change it below LCM.findPrime(); System.out.println(primeNumber); tag: while(in.hasNext()){ a = in.nextInt(); b = in.nextInt(); //test 0,if zero,simple,do nothing and continue... if(a==0 ||b ==0) continue tag; int [][] aTable = new int[primeNumber.size()][2]; int [][] bTable = new int[primeNumber.size()][2];; /***********table cal************/ for(int i = 0;i < primeNumber.size() ; i++){ for(int j = 0;j < primeNumber.size() ; j++){ if( a%primeNumber.get(i) == 0 ) { aTable[i][0] = primeNumber.get(i); aTable[i][1]++; a = a/primeNumber.get(i); } if( b%primeNumber.get(i) == 0 ) { bTable[i][0] = primeNumber.get(i); bTable[i][1]++; b = b/primeNumber.get(i); } } } //end cal table /************print LCM******************/ int i=0,j=0; while(aTable[i][0] != 0){ System.out.println("This is show a prime number is :"+aTable[i][0] +" occurs "+aTable[i][1]); i++; } while(bTable[j][0] != 0){ System.out.println("This is show b prime number is :"+bTable[j][0] +" occurs "+bTable[j][1]); j++; } int result = 1; //get the same value of a and b int [] temp = new int[primeNumber.size()]; int k = 0; for(int m = 0;m < primeNumber.size() ; m++){ if(aTable[m][0] !=0 ){ for(int n = 0;n < primeNumber.size() ; n++){ if(aTable[m][0] == bTable [0]) { temp[k] = aTable[m][0]; k++; aTable[m][1]--; bTable [1]--; }//inner if }//inner for }//if outer } int l = 0; while(temp[l] !=0) { result *=temp[l]; l++; } // previous value multiple the rest of not identical value for(int m = 0;m < primeNumber.size() ; m++){ if(aTable[m][0] !=0 && aTable[m][1] >0) result *=(aTable[m][0] * aTable[m][1] ); } for(int n = 0;n < primeNumber.size() ; n++){ if(bTable[b][0] !=0 && bTable [1] >0) result *= (bTable [0] * bTable [1] ); } //print System.out.println(" LCM is :" + result); }//end outer for }//end non-daemon //prime cal static void findPrime(){ //get prime number less than 100 primeNumber = new ArrayList<Integer>(); label: for (int i = 2; i < 100; i++) { int sqrt = (int) Math.sqrt(i); if(i ==2 || i%2 != 0){ for( int j=2; j <=sqrt ; j++){ if( i%j == 0) continue label; } primeNumber.add(i); } } } }
输出测试:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 120 150 This is show a prime number is :2 occurs 3 This is show a prime number is :3 occurs 1 This is show a prime number is :5 occurs 1 This is show b prime number is :2 occurs 1 This is show b prime number is :3 occurs 1 This is show b prime number is :5 occurs 2 30 LCM is :600 150 180 This is show a prime number is :2 occurs 1 This is show a prime number is :3 occurs 1 This is show a prime number is :5 occurs 2 This is show b prime number is :2 occurs 2 This is show b prime number is :3 occurs 2 This is show b prime number is :5 occurs 1 30 LCM is :900
相关文章推荐
- 蓝桥杯-5-1最小公倍数(java)
- Java实现最小公倍数和最大公约数
- Java求两个数的最大公约数最小公倍数
- Java基础编程之输入两个正整数m和n,求其最大公约数和最小公倍数。
- 算法-蓝桥杯-算法训练 5-1最小公倍数 (JAVA)
- Java输入两个正整数m和n,求其最大公约数和最小公倍数。
- java基础-利用基本循环语句计算输入的两个整数的最大公约数和最小公倍数
- Java-最大公约数与最小公倍数
- JAVA :最小公倍数与最大公约数
- Java 求两个数最小公倍数
- java 输入两个正整数 m 和 n,求其最大公约数和最小公倍数
- 关于用Java来写最大公约数和最小公倍数的问题详解及代码
- JAVA求多个数的最小公倍数
- 蓝桥杯 ALGO-148 算法训练 5-1最小公倍数 java版
- 蓝桥杯 算法训练 5-1最小公倍数 JAVA
- java学习--求最小公约数和最大公倍数
- 【Java笔试题】最大公约数和最小公倍数
- 1-100最小公倍数问题(Java BigInteger版本)
- 最大公约数与最小公倍数Java
- JAVA 输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。