• ベストアンサー

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はまだ初心者なもので… どなたか詳しい方、どうかアドバイス、またはご教授お願い致します。

noname#41422
noname#41422
  • Java
  • 回答数3
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
noname#119918
noname#119918
回答No.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)
回答No.2

自分自身を呼ぶ 再帰関数を使っていますので『再帰』についても調べてみましょう Javaの場合 ポインタによる参照渡しを使えませんのでその辺りも調べてみる必要があるでしょう 別クラスとして定義し再帰中で使われるパラメータをフィールドとして定義して呼び出すよにします 関数fなら Class fを定義 x,yをフィールドを定義 Class fに 関数fを定義 dが戻り値、a,bを引数といった具合です

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

ひとつずつ分解して解決したらどうだろうと思うんだけど・・・ とりあえず atoi と argc,argv について調べるところから始めたら良いんじゃないかな。

関連するQ&A

  • ソースプログラムのエラー

    自分で四則演算のプログラムを組んだのですが エラーが出てお手上げ状態です。 どこが間違っているのかどなたか教えていただけませんか?? ちなみに足し算の場合はいくつ足しても計算できるという プログラムです☆ #include<stdio.h> int main(int argc, char *argv[]){ int i,a=0,b=0,x=0; int m=0; if(argv[1]!="+"||argv[1]!="-"||argv[1]!="*"||argv[1]!="/"||){ printf("指定された文字ではありませんよ\n"); return -1; } a = atoi(argv[2]); b = atoi(argv[3]); if(argv[1]=="-"){ m=a-b; } if(argv[1]=="*"){ m=a*b; } if(argv[1]=="/"){ m=a/b; } if(argv[1]=="+"){ for(i=2;i<argc;i++){ x=atoi(argv[i]); m+=x; } printf("%d\n",m); return 0; }

  • ユークリッド互除法

    ユークリッド互除法を使用して最大公約数を求めるプログラムを、C言語で書いてみました。 #include <stdio.h> main() { int a, b, t; scanf("%d %d", &a, &b); if(a<b){ t=a; a=b; b=t; } while(b != 0){ t = a % b; a = b; b = t; } printf("GCD = %d\n", a); return 0; } これを、もっと簡略化できるらしいのですが、これ以上できることはありますか? どう考えてもわかりません

  • C++でのプログラムについての質問です

    このような二次関数の解を求めるプログラムを作成したのですが、自作関数solveをvoid solve(double, double, double)のように変更し同じ動作をするように変更したいです どのようにへんこうすればよいでしょうか #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; }

  • C言語のプログラム

    C言語で2つの微分方程式をEuler法、Heun法、Runge-Kutta法により求めるプログラムを作りたい。ただし、初期条件はx=0,y=1とする。また、間隔Δxを変えたときの解の変化を調べたい。 Euler法のプログラムはどうにか分かったのですが、Heun法、Runge-Kutta法のプログラムがわかりません。 Euler法のプログラム #include_<stdio.h> #include_<math.h> int_main(){ __double__a=0; __double__b; __int_____m=10; __int_____n; __double__h; __double__x,y; __double__dydx; __int_____k; __double__e; __double__f; __printf("オイラー法計算例:y=e^x,_y=1/e^4x\n\n"); __//_y_=_e^x __b_=_1; __for(n=100;n<=10000;n*=100){ ____h_=_(b-a)/n; ____printf("y'_=_y:_h(=dx)_=_%.1e_(y=e^x)\n",h); ____x_=_a;_y_=_1; ____for(k=0;k<=n;k++)_{ ______x_=_k*h; ______if(k%(n/m)==0)_{ ________f_=_exp(x); ________e_=_fabs(y-f); ________printf("x=%.2f,_y=%f,_e^x=%f_er=%.0e\n", ________x,y,f,e); ______} ______dydx_=_y; ______y_=_y_+_dydx*h; ____} __} __printf("\n"); __//_y_=_1/e^4x __b_=_4; __for(n=100;n<=10000;n*=100){ ____h_=_(b-a)/n; ____printf("y'_=_-4y:_h(=dx)_=_%.1e_(y=1/e^4x)\n",h); ____x_=_a;_y_=_1; ____for(k=0;k<=n;k++)_{ ______x_=_k*h; ______if(k%(n/m)==0)_{ ________f_=_exp(-4*x); ________e_=_fabs(y-f); ________printf("x=%.2f,_y=%f,_1/e^4x=%f_er=%.0e\n", ________x,y,f,e); ______} ______dydx_=_-4*y; ______y_=_y_+_dydx*h; ____} __} __return_0; } 分かる方がいましたら、回答よろしくお願いします。

  • プログラムC

    前にも質問したのですがヒルベルト曲線を用いて画像をスキャンするプログラムとビットマップの画像を読み込むプログラムを用いてお互いの座標を関連付けてヒルベルト曲線の座標にビットマップの1画素ずつの値を代入したいのですがどうしてもうまくいかなく質問しました。 前に質問した物はhttp://oshiete1.goo.ne.jp/kotaeru.php3?q=1106704 にあります。ヒルベルトは質問覧にビットマッピはNO2の補足にあります。プログラムを書くと800字を超えてしまうのでそのようにしました。 ヒルベルトは他に #include<stdio.h> int x,y; int n; void RUL(int n),DLU(int n),LDR(int n),URD(int n); main() { scanf("%d",&n); printf("#位相%dのヒルベルト曲線\n",n); x=0; y=0;printf("(%d %d) ",x,y); RUL(8); } void RUL(int n) { if(n<=0) {return;} URD(n-1);x=x+1;printf("(%d %d)",x,y); RUL(n-1);y=y+1;printf("(%d %d)",x,y); RUL(n-1);x=x-1;printf("(%d %d)",x,y); DLU(n-1); } void DLU(int n) { if(n<=0) {return;} LDR(n-1);y=y-1;printf("(%d %d)",x,y); DLU(n-1);x=x-1;printf("(%d %d)",x,y); DLU(n-1);y=y+1;printf("(%d %d)",x,y); RUL(n-1); } void LDR(int n) { if(n<=0) {return;} DLU(n-1);x=x-1;printf("(%d %d)",x,y); LDR(n-1);y=y-1;printf("(%d %d)",x,y); LDR(n-1);x=x+1;printf("(%d %d)",x,y); URD(n-1); } void URD(int n) { if(n<=0) {return;} RUL(n-1);y=y+1;printf("(%d %d)",x,y); URD(n-1);x=x+1;printf("(%d %d)",x,y); URD(n-1);y=y-1;printf("(%d %d)",x,y); LDR(n-1); } があります。

  • 全くわかりません。

    C言語の課題が全くわかりません。 (1)~(5)には何が入りますか? 丸投げですいません。後でじっくり考えます。 お願いします。 コマンド行引数に整数と符号(+、ー)を指定し、 その和を表示するプログラム。 例%calc -5+10+100-10=95と表示するプログラム #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { int sum=0,i=1; if(argc(1)1) put("komanasi"); else if(argv[i],(2)=='+'){ i++; sum += atoi(argv[i(3)]); }else if (argv[i],(2)=='-'){ i++; sum-=atoi(argv[i(3)]); }else sum+=atoi(argv[i(3)]); while((4)<(5)){ if(argv[i],(2)=='+'){ i++; sum+=atoi(argv[i(3)]); }else{ i++; sum-=atoi(argv[i(3)]); } } printf("%d\n",sum); return(0); }

  • C言語のプログラムに関することで質問です。

    C言語のライブラリを利用したプログラムのことで質問なのですが、座標xとyの成分から、ベクトルの角度(t)と大きさ(r)を求めるプログラムを作りました。しかし、このままのプログラムだと、ある場合のときに限り、正しい値が返されなくなるらしいのですが、それはどのような場合で正しい値が返されなくなってしまうのかを教えてください。また、正しい値がでるようにするにはどこをどう直したらよいのでしょうか? 自分でも考えてみたのですが、分からず困っています。分かる方どうかよろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define square(x) ((x) * (x)) //ベクトルの角度θを返す関数 double theta(double x, double y) { return atan(y / x); } //ベクトルの大きさを返す関数 double radius(double x, double y) { return sqrt(square(x) + square(y)); } int main(int argc, char **argv) { double x, y; //x, yは座標 double t, r; //t, rは極座標 if(argc == 3 && (x = atof(argv[1])) && (y = atof(argv[2]))) { t = theta(x, y);  //極座標tを計算 r = radius(x, y); //極座標rを計算   //ベクトルの角度と大きさを表示 printf("t = %f, r = %f\n", t, r); } return 0; }

  • C++で二次方程式のプログラム

    大分前に二次方程式のプログラムを作るって問題が出ていました。 しかし、セットで作ったプログラムのフローチャートを書くんですがフローチャートが分かりません。 条件は 虚数解 a=0 実数解 の場合分けをして、解を出すってプログラムなんですが、多分、それ自体は合っていると思います。 しかし、そのフローチャートを書きなさいって問題があったんですが、それが未だに分からないんですが、これをフローチャートに書くとすると、どう書けばいいですか? #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c,d,x0,x1; cout << "aを入力してください\n"; cin >> a; cout << "bを入力してください\n"; cin >> b; cout << "cを入力してください\n"; cin >> c; d=b*b-4*a*c; x0 = (-b + sqrt(d)) / (2 * a); x1 = (-b - sqrt(d)) / (2 * a); if(a==0) { cout << "解は1つで" << -c/b << "です\n"; } else if(d>0) { cout << "解は二つの実数解で,解は" << x0 << "," << x1 << "です\n"; } else { cout << "解は二つの虚数解で,解は" << (-b) / (2 * a) << "+i" << sqrt(-d) / (2 * a) << " , " << (-b) / (2 * a) << "-i" << sqrt(-d) / (2 * a) << "です\n"; } return 0; }

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • ニュートン法をC言語でプログラム

    方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める という問題をC言語のプログラムを作り計算したいのですが分かりません。 自分で考えてみたプログラムは以下の通りです。 #include <stdio.h> #include <math.h> #define f1(x) cos(x)*cos(x)-0.5 #define f2(x) sin(2*x) /* ニュートン法による方程式の解 */ main() { double x0,x1,a,b,c,d,g,n; a=1; x0=0.7; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解 x= %f \n", a,x1); x0=x1; } } 自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。 参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。 例: e^x-3=0 の解をニュートン法により計算する。 #include <stdio.h> #include <math.h> #define f1(x) exp(x)-3 #define f2(x) exp(x) /* ニュートン法による方程式の解 */ main() { double x0,x1,e,a,b,c,d,g,n; a=1; x0=3; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解  x= %f \n", a,x1); x0=x1; } }

専門家に質問してみよう