- ベストアンサー
Cで書かれたユークリッド互除法プログラムをJavaに
a と b とを与えて d=GCD(a,b) と ax+by=d の解 x,y を与えるプログラム: #include<stdio.h> void f(int a,int b,int*d,int*x,int*y) { int x1,y1; if(b==0) {*x=(a>=0?1:-1); *y=0; *d=abs(a);} else { f(b,a%b,d,&x1,&y1); *x=y1; *y=x1-(a/b)*y1; } return;} int main(int argc, char**argv) { int a,b,d,x,y; if(argc!=3) exit(0); f(a=atoi(argv[1]), b=atoi(argv[2]), &d, &x, &y); printf("\n %d * %d + %d * %d = %d \n\n", a,x,b,y,d); } 上記のCプログラムをJavaに書き換えたいのですが、まったくといっていいほど手も足も出ません。 Javaはまだ初心者なもので… どなたか詳しい方、どうかアドバイス、またはご教授お願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Javaとして適切な書き方は別にあるでしょうが、 CのソースをそっくりJavaのソースに置き換えると下記のとおりです。 Javaではポインタが使えませんから、 長さ1の配列で代用しています。 正しくは、redfox63さんもおっしゃっている様に、 クラスの利用などを考えるべきだと思います。 class gcd { private static void f(int a , int b , int[] d , int[] x , int[] y) { int [] x1 = new int[1]; int [] y1 = new int[1]; if(b == 0) { if(a >= 0) x[0] = 1; else x[0] = -1; y[0] = 0; d[0] = Math.abs(a); } else { f(b , a%b , d , x1 , y1); x[0] = y1[0]; y[0] = x1[0] - (a/b)*y1[0]; } } public static void main(String args[]) { int a,b; int [] d = new int[1]; int [] x = new int[1]; int [] y = new int[1]; if(args.length != 2) { System.exit(0); } a = Integer.parseInt(args[0]); b = Integer.parseInt(args[1]); f(a , b , d , x , y); StringBuffer buf = new StringBuffer(); buf.append(a); buf.append(" * "); buf.append(x[0]); buf.append(" + "); buf.append(b); buf.append(" * "); buf.append(y[0]); buf.append(" = "); buf.append(d[0]); System.out.println(buf.toString()); } }
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
自分自身を呼ぶ 再帰関数を使っていますので『再帰』についても調べてみましょう Javaの場合 ポインタによる参照渡しを使えませんのでその辺りも調べてみる必要があるでしょう 別クラスとして定義し再帰中で使われるパラメータをフィールドとして定義して呼び出すよにします 関数fなら Class fを定義 x,yをフィールドを定義 Class fに 関数fを定義 dが戻り値、a,bを引数といった具合です
- SAYKA
- ベストアンサー率34% (944/2776)
ひとつずつ分解して解決したらどうだろうと思うんだけど・・・ とりあえず atoi と argc,argv について調べるところから始めたら良いんじゃないかな。