- ベストアンサー
二つの自然数の最大公約数を求める方法
- 二つの自然数を引数として与えられて,それらの最大公約数を返す関数int gcd(int m, int n) { /* … */ }を作成し,それを利用して入力された二つの正整数の最大公約数を求めるプログラムを作り方を教えてください。
- ユークリッドの互除法を使い、関数を使う事が条件なのですが全然わかりません。
- #プログラミング #最大公約数 #ユークリッドの互除法
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
《年寄りの小言》 ・質問主旨とは無関係な不具合( scanf("%d",na);等)が多すぎます。 ・自分の「作品」を投稿するのだから、コンパイラをとおして化粧しないと。 (不明でメモ同然な部分は、「コメント」行としてコンパイル) return 0; でなく return0; であることは後述。 ----------------------------------------- 《回答》 ☆「ウィキペディア」で「最大公約数」、そこからのリンクで「ユークリッドの互除法」をたどると「アルゴリズム(◆)」まで載ってる。 この平文をC言語にするだけ・・。「だけ」としましたが、「なぞなぞ」を解く感覚で。 ★「コロンブスの卵」ということもあるのでソースを投稿します(Borland c++5.6.4)。 ----------------------------------------- 《余談》 下のソースは、main() の型を void としています。99年だったか、 void main() が「処理系定義の方法」として、標準規格に追加(除く++)されましたが、 ・void main() を「エラー」とする処理系ってあるのかなぁ。 ----------------------------------------- 《質問者様への勧告》 ← (冗談です) ・int main( void ) を使い続けろ(温故)。 ・return( 0 ); と括弧を付けなさい(中の 0 は詮索せず、まれに負の数としてみなさい) ----------------------------------------- #include <stdio.h> #include <math.h> int gcd( int m, int n ) { m = abs( m ); // 正の整数 n = abs( n ); // 〃 while( m * n ){ // どちらも 0 でない間 if( n > m ){ n %= m; // ◆4. if( ! n ) return( m ); // ◆2. } if( m > n ){ m %= n; // ◆4. if( ! m ) return( n ); // ◆3. } } return( -999 ); // ここにはこないが・・ } void main() { int iKekka; int na = 1071, nb = 1029; // 入力部割愛 iKekka = gcd( na, nb ); if( 1 == iKekka ) printf( "(%d,%d) は互いに素である。\n", na, nb ); if( 1 != iKekka ) printf( "(%d,%d) の最大公約数は %d です。\n", na, nb, iKekka ); } //注:インデントに全角空白を用いています。タブに一括変換して下さい。
その他の回答 (2)
- asuncion
- ベストアンサー率33% (2127/6289)
> ユークリッドの互除法を使い 手で互除法を使うことはできますか? もしできるならば、その手順を忠実にコード化すれば完成です。
- fifaile
- ベストアンサー率25% (622/2403)
>ユークリッドの互除法を使い、関数を使う事が条件なのですが 学校の課題ですか? では丸投げ行為は禁止されているので、ソースコードを答えることはできません。 というか、検索ぐらいしたほうがいいですよ。 http://www.google.com/search?hl=ja&inlang=ja&q=C%2B%2B%E3%80%80%E4%BA%92%E9%99%A4%E6%B3%95%E3%80%80%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0&lr=