• 締切済み

a,bの最大公約数を求める関数をつくってみたのですが、aまたはbが零の

a,bの最大公約数を求める関数をつくってみたのですが、aまたはbが零の時の処理としては、どのようにするのが適当かがわかりません。ある数と零の最大公約数ってどうなるんでしょうか? #include <iostream> using namespace std; // 整数 a, b の最大公約数を求める int gcd(int a, int b) { if(b == 0) return -1; // この戻り値は適当なのか? int r = a % b; // aをbで割った余り if ( r == 0 ) return b; // 余りが0ならbが最大公約数である else return gcd(b,r); // 余りが0でなければbとrの最大公約数を返す } int main() { cout << "gcd(1000,100) = " << gcd(1000, 100) << endl; return 0; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

数学的にいうと, 「a (≠ 0) と 0 の最大公約数」は定義するなら a. a = 1・a, 0 = 0・a とどちらも「a の倍数」といえますね. とはいうけど, 別に「数学的な定義」に従う必要はないので「別のものがいい」ということであるならそれを妨げるものではありません.

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

数学的にありえないから例外の投げるのが良いのでは。 何もしなくてもDIV/0が発生しますけど。 また、負を返すと異常を表すか決めてるなら、それもアリかと。

関連するQ&A

  • 最大公約数を求めたい!

    二つの数字の最大公約数を求めたいのですがどうしたらいいのかわからず困っています…。プログラムに関しては初心者なのでどなたか分かりやすく教えてもらえませんか?? <さらにもし出来る方がおられたら…>------------------------------------ 実は最終的にはある数(a(素数))があって、そのaと”たがいに素”である数(b)をプログラムで求めたいんです…。 ある本によると適当な二つの素数p、qがあるとしてこのふたつの積(つまりp*q)をmとします。また、(p-1)(q-1)=aとすると ”gcd(b,a)≡1(mod m)” という式を満たすんだそうです…。 ※この中にでてくる値で実際に分からないのは"b"のみです。 ※ここで書いているgcd(b,a)というのはaとbの最大公約数のことです。 --------------------------------------------------------------------- かなり難しいのでこの質問の回答をいただくと本当に助かります。 よろしくお願いしますm(_ _)m

  • 最大値(c++)

    3つの数の最大値をArrayを使って求めるProgramを書いてます。何とかそれっぽくできたのですが、実行すると、一番初めに入れた数が最大値であると、表示されてしまいます。 なにが問題なのでしょうか? #include<iostream.h> int max(int n[], int size){ int max= n[0]; for (int i=1; i>size; i++) if(n[i]>max) max= n[i]; return max; } int main(){ int a,b,c; cout<<" 3つの数の最大値を求めます。順に3つの数字をいれてください。"<<endl; cin>>a>>b>>c; int d[]={ a,b,c }; cout<<"max :"<<max(d,sizeof d/ sizeof d[0])<<endl; return 0; }

  • 再帰関数とユークリッドの互除法を用いて最大公約数を求める

    学校の課題で、再帰関数とユークリッドの互除法を用いて10~100000までの最大公約数を求めるという問題が出て自分でプログラムを作ってみたのですが無限ループに入ったり、関数が使えてないみたいでできません。プログラムを見て頂いて、どこを改善したらいいかを教えてください。 #include <stdio.h> /* 正整数 n, m の最大公約数を計算する */ int gcd(int n, int m) { int res; res = n % m; if (res == 0) return m; /* 最大公約数が求まった */ return gcd(m, res); /* 再帰呼び出し */ } int main(void) { int i,j; for(i=10000;i>=10;i--){ for(j=10;j=10000;j++){ printf("%d to %d no saidaikouyakusuu ha %d \n", i, j, gcd(i, j)); } } return (0); } です。期限が今日の夜までで、ぎりぎりなんですがよろしくお願いします。

  • 最大公約数

    2つの正の整数をA、Bとし、AをBで割ったときの商をQ、あまりをRとすれば、A、Bの最大公約数はB、Rの最大公約数に一致するのはなぜですか?

  • 最大公約数の証明

    a,b>1の時、gcd(a,b)=dならばgcd(a^2,b^2)=d^2となるのを説明せよ。 っていう問題で、説明の仕方がわかりません。 aが例えば2*3=6で、bが2*3*3=18だとすれば公約数は2*3で、aとbを2乗すると2^2*3^2と2^2*3^4になって共通なのは公約数の2乗になるからって・・・説明にもなってないようなことしか思い浮かびません・・・。 よろしくおねがいします。

  • 最大公約数を再帰で求める(pascal)

    入力した整数値の最大公約数を出力するプログラムを再帰呼び出しの形式で作れ、という課題が出ました。 再帰でない形式は下のように作れたのですが、再帰形式がどうしてもできません。どなたかご教授ください。 function gcd(a,b:integer):integer; {関数部} var tmp:integer; begin if a<b then begin tmp:=b; b:=a; a:=tmp end; repeat tmp:=b; b:=a mod b; a:=tmp until b=0; gcd:=a end; repeat {計算部、i=n=入力した個数、max=入力できる最大数} i:=i+1; n:=n+1; data[i]:=x; writeln('値:'); readln(x); until (x=0) or (i=max); if i>=2 then begin p:=gcd(data[1],data[2]); if i>=3 then begin for i:= 3 to n do begin p:=gcd(p,data[i]) end; writeln('最大公約数:',p) end else begin writeln('最大公約数:',p) end;

  • 2^91-1と2^65-1の最大公約数

    2^91-1と2^65-1の最大公約数を求めるにはどうすればいいのですか? これほど大きな値だと共通の素数で割ることもユークリッドの互除法も使えそうにありません。 ちなみにコンピュータに解いてもらったら GCD(2^91-1,2^65-1)=8191 でした。

  • 最大公約数について

    「a,b,c,rが正の整数で、a=rb+cであるとき、a,bの最大公約数とb,cの最大公約数は一致することを証明せよ。」 という問題の解答の出だしが、 「aとbの最大公約数をm、bとcの最大公約数をnとおくと a=mA, b=mB(AとBは互いに素な整数) b=nB',c=nC(B'とCは互いに素な整数) と書ける」 となっているのですが、なぜこう書けるのかわかりません。 「a=mA, b=mB」「b=nB',c=nC」とかけるのはわかりますが、なぜAとB,B'とCが互いに素と言えるのかわかりません。 思いつく反例を上げると、a,b,cは異なる数とは問題文に書かれていないので、もしaとbが同じ数だとしたらA=Bとなり互いに素ではありませんよね?

  • aとbをa=b=0でない2つの整数とする。a,bの公約数の集合の中の最

    aとbをa=b=0でない2つの整数とする。a,bの公約数の集合の中の最大数dを、aとbの最大公約数といい、 d=(a,b)とかく 例えば(6,4)=2 このときar+bs=(a,b)のような整数rとsが存在するというのを証明する。という問題です、教えてください。

  • 最大公約数の問題

    公約数と公倍数、という単元の問題なのですが 問2-3が「次の最大公約数を求めよ」というもので (39,18,8) などの問題が出されており、それに続く問題として 問2-4 自然数 a,b,c に対して ((a,b),c)=(a,(b,c)) が成り立つことを示せ。 というものがあります。 最大公約数を使って解く問題だとは予想できるのですが、どのようにすれば証明できるのかが分かりません。 その前の問題では、ユークリッドの互除法を用いて最大公約数を求めていました。 どなたか分かる方がいらっしゃいましたら、ご教授願います。

専門家に質問してみよう