記事ディレクトリ
序文
Acwing c++ Blue Bridge Cup Tutorial - AcWing 1223 の第 8 講を学習する際の最大の比率は指数の最大公約数を求めるために使用されます。
現在の記事はブログ ファイル ディレクトリ インデックスに含まれています:ブログ ディレクトリ インデックス (継続的に更新されます)
ローリングおよび除算法 (ユークリッド アルゴリズムとも呼ばれます)
応用: 投げて割り算は実際にはユークリッド アルゴリズムであり、主に2 つの整数の最大公約数を見つけることです。
例: gcd(5 2 , 5 3 ) = 5 2
注: 指数形式の最大公約数を取得するには、ローリングおよび減算の方法を使用する必要があります。
コード: 時間計算量 O(logn)。
class Solution {
//欧几里得算法(辗转相除法)
public static int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
public static void main(String[] args) {
System.out.println(gcd(12, 5));
}
}
ローリングアンドサブトラクション法(位相サブトラクション法とも呼ばれます)
原始的な減算法
シナリオ: 位相リダクション法は、「算術九章」の最大公約数を求めるアルゴリズムで、本来はリダクション用に設計されたものですが、最大公約数を必要とするあらゆる場面に適しています。
原理: gcd(a,b)=gcd(b,a−b)。
コード:
public static int gcd_sub(int a, int b) {
while (a != b) {
if (a > b) {
a = a - b;
} else {
b = b - a;
}
}
return a;
}
減算法の改訂版(減算は指数)
アルゴリズム問題: AcWing 1223。最大比率
導出はgcd(x,y) = gcd(y,x%y) = gcd(y,x−y)
ローリングと減算によって実行されます。 f(p x ,p y ) = p gcd(x,y) = p gcd(y,x−y) = f(p y ,p( x−y )) = f ( p y , pxpy \frac{px}{py}ぴー_エックス_)、つまり、次のように求めることができます
p xと p yのべき乗の最大公約数べき乗 p gcd(x,y)を求めます。
応用: ローリングおよび減算法を使用して、次のようないくつかの形状を見つけることができます ( pq \frac{p}{q}qp)はriの数の最大公約数です。
例 (指数の最大公約数): gcd_sub(5 2 , 5 3 ) = 5 1
アルゴリズム導出プロセス: f(p x ,p y ) = p (x,y) = p (y,x−y) = f(p y ,p( x−y )) = f(p y , pxpy \frac {px}{py}ぴー_エックス_)
- pq \frac{p}{q}qpもう力として表現することはできません。
- p、q、ri はすべて正の整数です。
コード: 時間計算量 O(n)
class Solution {
/**
* 辗转相减法(指数的最大公约数)
* @return
*/
public static int gcd_sub(int a, int b) {
if (b == 1) return a;
if (a < b) {
int temp = a;
a = b;
b = temp;
}
return gcd_sub(b, a / b);
}
public static void main(String[] args) {
System.out.println(gcd_sub(25, 125));
}
}
参考記事
[1].転がり・旋回減算法
[2]. 【最大公約数 GCD】 — 一般的に使用される 4 つのアルゴリズム (反転除算法、網羅的法、位相削減法、スタイン アルゴリズム)