- 最大公约数
- 最小公倍数
- 分解质因数
- 因数
- 因子数
package test.com;
import java.util.ArrayList;
public class Demo2_Gcd {
//关于求解数的最大公约数、最小公倍数及分解质因数的小结
public static void main(String[] args) {
int d = gcd(319, 377);
System.out.println(d);
int d2 = gcd2(319, 377);
System.out.println(d2);
System.out.println("==============");
int m2 = mcd(36, 270);
System.out.println(m2);
System.out.println("==============");
System.out.println(isPrime(2));
System.out.println("==============");
System.out.println(sumPrime(100));
System.out.println("==============");
Integer[] p2 = sumPrime2(100);
for (int i = 0; i < p2.length ; i++) {
System.out.println(p2[i]);
}
}
//最大公约数
public static int gcd(int a, int b){
int temp = a % b;
if(temp != 0){
return gcd(b, temp);
}else
return b;
}
//最大公约数-欧几里得算法
public static int gcd2(int a, int b){
if(b == 0) return a;
int temp = a % b;
return gcd2(b, temp);
}
//最小公倍数=两数的乘积/最大公约(因)数
public static int mcd(int a, int b){
int c = a * b;
return c /gcd2(a,b);
}
//判断一个数是否是素(质)数
public static boolean isPrime(int num){
if(num < 2) return false;
for (int i = 2; i * i <= num ; i++){
/*for (int i = 2; i <= Math.sqrt(num) ; i++)*/
if(num % i != 0 ){
return false;
}
}
return true;
}
//求数的质因数及其所有质因数的和
public static int sumPrime(int num){
ArrayList<Integer> list = new ArrayList<>();
for (int i = 2; i <= num ; i++) {
if( num % i == 0){
list.add(i);
num = num / i;
i = 1;
}
}
if(num > 1) list.add(num);
//return list.toArray(new Integer[list.size()]);
//求和
int sum = 0;
for (int i = 0; i < list.size(); i++) {
sum += list.get(i);
}
return sum;
}
public static Integer[] sumPrime2(int num){
ArrayList<Integer> list = new ArrayList<>();
for (int i = 2; i <= num ; i++) {
while ( num != i){
if(num % i != 0){
break;
}
list.add(i);
num = num / i;
}
}
list.add(num); //num会取到1?
return list.toArray(new Integer[list.size()]);
}
//因数
public static int count(int n){
/**
* @Description 因数包括这个数本身而因子不包括
* 因子包括1不包括本身。因数包括本身。比如6的因子是1,2,3. 而10 的因数是1,2,3,6.
* @Author Kyrie
* @Date *****
* @Param [n]
* @Return int
*/
int s = 1;
for(int i = 2; i*i <= n; i++){ // for(int i=2;i<=n;i++){ 前者更高效一点
if(n % i == 0){
int a=0;
while(n % i == 0){
n /= i;
a++;
}
s = s * (a + 1); // 根据公式推导
}
}
if(n > 1) s = s * 2;
return s;
}
//所有因数之和
public static int sum(int n){
int s = 1;
for(int i = 2; i * i <= n; i++){
if(n % i == 0){
int a=1;
while(n % i == 0){
n /= i;
a *= i;
}
s = s * (a * i - 1) / (i - 1);
}
}
if(n > 1) s = s * (1 + n);
return s;
}
}
说明:
一个for循环和它的while形式有什么区别:在一个典型的 for 循环中,递增变量一般在循环结束之后都是不可用的;但在和它等价的 while 循环中,递增变量在循环结束之后仍然是可用的。这个区别常常是使用 while 而非 for 循环的主要原因。