【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

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はまだ初心者なもので…

どなたか詳しい方、どうかアドバイス、またはご教授お願い致します。

A 回答 (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());
}
}
    • good
    • 0

自分自身を呼ぶ 再帰関数を使っていますので『再帰』についても調べてみましょう



Javaの場合 ポインタによる参照渡しを使えませんのでその辺りも調べてみる必要があるでしょう

別クラスとして定義し再帰中で使われるパラメータをフィールドとして定義して呼び出すよにします

関数fなら
Class fを定義 x,yをフィールドを定義
Class fに 関数fを定義 dが戻り値、a,bを引数といった具合です
    • good
    • 0

ひとつずつ分解して解決したらどうだろうと思うんだけど・・・


とりあえず atoi と argc,argv について調べるところから始めたら良いんじゃないかな。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!