私は混合数値クラスを作成していて、すばやく簡単な「最大公約数」関数が必要です。誰か私にコードやコードへのリンクを教えてもらえますか?C++でのGCD関数sans cmathライブラリ
答えて
私は投票に賛成できません。実装を見つけるのは難しいと信じるのは難しいようですが、確かに分かっています。
unsigned GCD(unsigned u, unsigned v) {
while (v != 0) {
unsigned r = u % v;
u = v;
v = r;
}
return u;
}
ありがとうございました。そして、私は20分間グーグルでグーグル・グーグルでプレーし、明確な結果を得られなかった。 –
なぜ符号なしを使用するのですか? –
@EnjoysMath:ほとんどの場合、GCDを使いたいと思っているのは、ほとんどの場合、あなたは符号なしの数字を扱っているからです。 –
迅速な再帰バージョン:
unsigned int gcd (unsigned int n1, unsigned int n2) {
return (n2 == 0) ? n1 : gcd (n2, n1 % n2);
}
または同等の反復バージョンあなたが激しく再帰に反対している場合(a)の:自分で
unsigned int gcd (unsigned int n1, unsigned int n2) {
unsigned int tmp;
while (n2 != 0) {
tmp = n1;
n1 = n2;
n2 = tmp % n2;
}
return n1;
}
だけで代用(例えば、bignum
クラスのような非基本型を使用している場合)、データ型、ゼロ比較、代入、モジュラスの各メソッドがあります。
この関数は実際には画面サイズの積分アスペクト比を計算するためにearlier answer of mineから来ましたが、元のソースは長い時間前に学んだユークリッドアルゴリズムでした。詳細はhere on Wikipediaです。
(a)は、いくつかの再帰的なソリューションと問題は、あなたがそこに着く前に、彼らはこのように非常に悪い考え抜か(擬似のように、あなたはスタック領域が不足する傾向があるので、ゆっくりと答えに近づくということですコード):あなたは()億を使い切るかそこらのフレームをスタックしようとして
def sum (a:unsigned, b:unsigned):
if b == 0: return a
return sum (a + 1, b - 1)
あなたはsum (1, 1000000000)
のようなものには、非常に高価な見つけることができます。再帰の理想的なユースケースはバイナリ検索のようなもので、反復ごとにソリューションの領域を半分に減らします。最大公約数は、解空間が急速に縮小され、大量のスタック使用に関する不安がそこに根付いていないものです。
EuclideanアルゴリズムはのlibstdC++アルゴリズムライブラリは、(私はG ++ 4.6.3を使用しています)隠しGCD機能を持つC.
にint gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
書くことは非常に簡単です。
#include <iostream>
#include <algorithm>
int main()
{
cout << std::__gcd(100,24);
return 0;
}
あなたは
UPDATE歓迎:)です:@のchema989はC++ 17で、それを指摘したように<numeric>
ヘッダーで使用可能なstd::gcd()
機能があります。
ライブラリリリース間で変更できるため、文書化されていない機能に頼るべきではありません。 – vmrob
MSVCで利用できますか? –
@vmrob:合意。いつでもSTLから実装をコピーできます。 Mbt925:完了。 –
私の2セント。符号なし整数型のためXOR swapを使用してテンプレートユークリッドアルゴリズム:
template <class Unsigned>
Unsigned gcd(Unsigned a, Unsigned b)
{
static_assert(
std::numeric_limits<Unsigned>::is_integer &&
!std::numeric_limits<Unsigned>::is_signed, "Unsigned required.");
while (b)
{
b ^= a;
a ^= b;
b = (b^a) % a;
}
return a;
}
ヘッダ<numeric>
で定義されたstd::gcd
あなたが使用できる17 C++の場合:ところで
auto res = std::gcd(10, 20);
- 1. C再帰関数 - GCD
- 2. 関数のオーバーロード時のオーバーロード時のエラーcmath関数C++
- 3. 数学インターフェースとC++のcMath
- 4. CライブラリでC関数
- 5. C++標準ライブラリがconstexprバージョンのcmath関数を提供しないのはなぜですか?
- 6. Swift 3のDispatchSourceのGCD関数イベントハンドラ?
- 7. C言語の関数を使用したGCD計算でのエラー
- 8. GCDを計算する - Python関数return
- 9. Cのライブラリの関数リストの検索
- 10. メインスレッドで複数のGCDディスパッチ
- 11. fgetsのC標準ライブラリ関数
- 12. 関数C++の標準ライブラリ関数のオーバーロード
- 13. cライブラリのコールバック関数でC++オブジェクトを呼び出す
- 14. C++ヘッダー専用ライブラリのインライン関数とテンプレート関数
- 15. ライブラリのJNI関数にC++関数ポインタを渡す方法
- 16. cmathのpow関数を指定し、ローカルでは宣言されていない
- 17. cmath asin()の問題
- 18. cmath内部の内装
- 19. プロトタイプ関数C++
- 20. Cライブラリ関数の引数を渡す引数の検出
- 21. LinuxのC++ライブラリからC++関数を呼び出す
- 22. 関数のライブラリtypescript
- 23. C#でAutoITライブラリのWinSetState関数を使用する方法
- 24. Cのユーザプログラムでlinuxライブラリ関数を使うには?
- 25. C++の数学関数の問題
- 26. 目的関数cで待機する関数を提供する任意のライブラリ関数
- 27. 最大公約数(GCD)
- 28. vimscriptでC++ライブラリ関数を呼び出す
- 29. monodevelop System.DllNotFoundException C++ライブラリで関数を呼び出す
- 30. NSRunLoopとGCDのキュー
:それは '最大公約数' と呼ばれます。 – bjoernz
楽しいものがたくさんあります:http://codegolf.stackexchange.com/questions/35587/ – technosaurus