2つの数の最小公倍数と最大公約数を探します
この日の午後、小さな仕事に滞在する第1の演算のレッスンでは、スムーズにそれを行います。
コンセプトの最大公約数と最小公倍数が説明されていない、暴力行為は望ましくないと言っていません。
ここで言っ ユークリッド と 減少方法 。
ユークリッド
ユークリッドアルゴリズムは、また、ユークリッドアルゴリズム知られている2つの自然数の最大公約数を求めるための方法です。
GCD(M、N)= M> = N、式仮定 GCD(N、MOD NをM)
次に、m個のMOD N = 0になるまで手段の最大公約数そのnおよびm = nおよびm / nの余りのを、 nは最大公約数であり、最小公倍数=(M 、N)/ GCD(M、N)
注:コードで通常M / GCD(M、N)のように記述 * N、 防止M n個のデータの過大バーストが爆発すること範囲
のJavaコード
public static int gcd(int m, int n) {
return m % n == 0 ? n : gcd(n, m % n);
}
public static void main(String[] args) {
//最大公约数 5
System.out.println(gcd(25, 15));
//最小公倍数 75
System.out.println(25 / gcd(25, 15) * 15);
}
法律を減少
式:GCD(M、N)= GCD(N、Mn)は、 MN = 0まで、MまたはN最小除数である
二つの整数をm及びn(M> = N)入力:
MN = 0の場合は1)、次いで、M(またはn)は2つの数の最大公約数であります
2)次に、MN≠0、次いで、M = N、N = Mnおよび場合はステップに戻る1
public static int gcd2(int m, int n) {
return m - n == 0 ? n : gcd2(n, m - n);
}
public static void main(String[] args) {
//最大公约数 5
System.out.println(gcd2(25, 15));
//最小公倍数 75
System.out.println(25 / gcd2(25, 15) * 15);
}
連続した整数の検出アルゴリズム
全体的な戦略は、最小の開始に加えて開始するあなたは見返りに枯渇している場合は、-1にサイクル分割しませんです。
public static int gcd3(int m, int n) {
int gcd = 1;
if (m == n) {
return n;
} else {
int min = m > n ? n : m;
for (int i = min; i > 1; i--) {
if (n % i == 0 && m % i == 0) {
return i;
}
}
return gcd;
}
}
public static void main(String[] args) {
//连续整数检测
//最大公约数 5
System.out.println(gcd3(25, 15));
//最小公倍数 75
System.out.println(25 / gcd3(25, 15) * 15);
}
分解品質係数は、すべての公約数の直交を見つけます
M、Nそれぞれの素因数分解し、その後すべての共通因子を見つけるために2つのグループを比較するには、直交GCDであります
public static int gcd4(int m, int n) {
if (m == n) {
return n;
} else {
//m的因数
List<Integer> _first = new ArrayList<>();
//n的因数
List<Integer> _second = new ArrayList<>();
//m分解质因数
for (int i = 2; i <= m; i++) {
while (m % i == 0 && m != 0) {
m /= i;
_first.add(i);
}
if (m == i) {
_first.add(i);
break;
}
}
//n分解质因数
for (int i = 2; i <= n; i++) {
while (n % i == 0 && n != 0) {
n /= i;
_second.add(i);
}
if (n == i) {
_second.add(i);
break;
}
}
//克隆m的所有因数
Set<Integer> tmp = new HashSet<>(_first);
//在m因数中除去m因数与n因数中共有部分 即公因数
tmp.removeAll(_second);
//克隆m所有因数
Set<Integer> exist = new HashSet<>(_first);
//除去剩余的tmp,剩余exist即为所有公因数list
exist.removeAll(tmp);
int gcd = 1;
for (Integer i :exist) {
gcd*=i;
}
return gcd;
}
}
public static void main(String[] args) {
//公因数算法检测
//最大公约数 5
System.out.println(gcd4(25, 15));
//最小公倍数 75
System.out.println(25 / gcd4(25, 15) * 15);
}