マイクロコンピューター制御の問題:CASL2プログラムの作成方法

このQ&Aのポイント
  • GR1とGR2の最大公約数を求めるCASL2プログラムの作り方について説明します。
  • 10進数を16進数に変換するCASL2プログラムの作り方を解説します。
  • 明日の午後4時までに解答を提出する必要があります。
回答を見る
  • ベストアンサー

マイクロコンピューター制御の問題です

「CASL2のプログラムを作成せよ」とのことで、次の問題が出されました。 問1.GR1の中身の値(正の整数)とGR2の中身の値(正の整数)の最大公約数をGR3 に入れて返すようなサブルーチンGCDを作れ。再帰を利用すること。   (ヒント)   最大公約数を求めるには、ユークリッドの互除法というアルゴリズムがある。C 言語で記述すると、再帰を使って以下のように書ける。  int gcd (int x,int y){ if (y==0)return x; return gcd(y,x%y); } 問2.IN命令により入力された10進数の数値を、16進数に変換して、OUT命令により 表示するプログラムをかけ。 以上の二つです。 手前勝手な事情ですが、明日8/9の午後4時までに、解答の方をよろしくお願いします。

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

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

レポートのようですので、ヒントだけにします。 (1)ユークリッドの互除法は2つの数を割り算して余りと除数を取り出します。   この2つで、更に割り算し・・・を繰り返し、余りが0になった時、除数が   最大公約数になっているというものです。   同じ計算を繰り返すので再帰処理が使えます。   C言語のヒントを見ると、そのようになっています。注意すべきは、最初に   x>yとしておくと判りがいい事です。   CASL2でやる注意点は次の通りです。    ・演算は全てレジスター演算でやる事。    ・定数以外はメモリーに取らない事。    ・関数の代わりに再帰のCALL文を使用。 (2)IN命令で入力されると文字列です。これを桁ごとに数値化して、   桁の重みをかけながら10進数(2進数)になおします。   その後、4ビットずつ切り出して(2進数の形をした16進数)それぞれを   16進(文字)に変換して出力エリアに入れます。   最後にOUT命令で出力します。

takkatakka
質問者

お礼

タイムオーバーとなってしまいました。 とりあえず、なんとか形にはなったので、大丈夫でしょう。 ヒント、ありがとうございました。 では

takkatakka
質問者

補足

せっかくのヒントなのですが、さっぱりわかりません。 なんとか解答の方をお願いできないものでしょうか? ちなみにレポートです。これが提出できないと、単位をくれないようで・・・。

関連するQ&A

  • 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; }

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

    学校の課題で、再帰関数とユークリッドの互除法を用いて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); } です。期限が今日の夜までで、ぎりぎりなんですがよろしくお願いします。

  • 【C言語】再帰を用いるプログラムでのセグフォ

    明解C言語入門編のp196にあるList8-7 再帰を用いて2つの整数の最大公約数を求めるプログラムなんですが #include<stdio.h> int gcdf(int vx, int vy) { return(vy == 0? vx: gcdf(vy,vx&vy)); } int gcd(int va, int vb) { return(va>vb? gcdf(va,vb): gcdf(vb,va)); } としてmainの中で入力された2つの整数n1,n2を 最大公約数としてgcd(n1,n2)を表示させるのですが、 (1,2)とか(2,4)などの再帰が1度しか行われない(?)プログラムでは ちゃんと結果が表示されるのですが、 (4,6)など再帰が2度以上行われるプログラムになると segmentation fault(コアダンプ) と表示されます。 どこに問題があるのでしょうか OSはubuntu14.04 エディタはvim コンパイラはclangです。 よろしくお願いします。

  • このプログラム見てほしいです!!

    #include <stdio.h> int gcd2(int a, int b) { if (!b) return a; return gcd2(b, a%b); } int main() { int a, b, c; printf("2つの任意の整数を入力せよ:"); scanf("%d %d",&a,&b); c=gcd2(a,b); printf("最小公倍数は%d\n",a*b/c); printf("最大公約数は%d\n",c); return 0; } で、最小公約数を出すことはできたのですが、全ての公約数を表示させたいんです!!どうやったらいいのでしょうか??プログラミングまだ初心者なので、ちょっと行き詰ってしまいました。。。 お時間があればでいいのですが、もう一つわからないプログラムがあります。 自然数nを入力し、x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるのかを出力するプログラムなのですが、全くわからず行き詰っています。。どなたかお時間があれば教えて頂きたいです。 色々と申し訳ありません。お願いします(__)

  • わかりません・・・。

    二つの自然数を引数として与えられて,それらの最大公約数を返す関数 int gcd(int m, int n) { /* … */ }を作成し,それを利用して入力された二つの正整数の最大公約数を求めるプログラムを作り方を教えてください。 ユークリッドの互除法を使い、関数を使う事が条件なのですが全然わかりません。 #include<stdio.h> int gcd(int m, int n) if(m>n) {m%n}            if(m%n==0) printf("最大公約数は%d",n); ←このあたりがわかりません else if (n%(m%n)) printf("最大公約数は%d",n%(m%n)); int main( void ) { int na, nb; puts(""二つの整数を入力してください。); printf("整数1:"); scanf("%d",na); printf("整数2:"); scanf("%d",nb); printf("最大公約数は%dです。\n",gcd(int m, int n)); return0; }

  • 最大公約数に関する問題です。

    最大公約数に関する問題です。 『2つの整数6186と4709の最大公約数(6189,4709)を求めよ。また、この最大公約数に対して、(6189,4709) = 6186X + 4709YとなるX,Yを見つけよ。』という問題です。最大公約数は1と求められたのですが、後半の『(6189,4709) = 6186X + 4709YとなるX,Yを見つけよ。』は、X,Y の組み合わせが無数にあると思うのですが、どうしたら良いのでしょうか?宜しくお願い致します。

  • 有理数の演算についてなんですが。。

    #include <stdio.h> typedef struct{ int bunshi; int bunbo; }rat; rat rat_num(int x,int y){ rat r; r.bunshi=x; r.bunbo=y; return(r); } void rat_print(rat x){ printf("%d/%d,"x.bunshi,x.bunbo); } int gcd(int n, int m) { int res; res = n % m; if (res == 0) return m; return gcd(m, res); } rat rat_normalize(rat x){//ここです** } rat rat_plus(rat x, rat y){ //足し算 } int main() { rat x={1,3}; rat y={3,4}; rat z; z=rat_plus(x,y); printf("1/3+3/4= ");rat_print(z);printf("\n"); } 分数の足し算のプログラムをつくりたくてだいたいのそと枠はできたのですが int gcd(int n, int m)のところではnとmの最大公約数を求めるものでたぶんここはできていると思うのですが、rat rat_normalize(rat x)のところでxを約分して返す。(x.bunshiとx.bunboをそれらの最大公約数で割る)っていうことをしたいんですけど、構造体を勉強しはじめたばかりでどのように書いたらよいかわかりません。教えてください。 rat rat_plus(rat x, rat y){ //足し算 }のところはそこがわかればできそうなので大丈夫です!! お願いします><

  • 離散数学 証明

    離散数学 証明 分からなくて困っています。助けてください。 任意の整数m,nに対して、次の問いを証明せよ。 ・任意の非負整数kに対して、gcd(km,kn)=k・gcd(m,n) 証明の一番初めは gcd(km,kn)=dとする。(d∈Z) Zは整数 だと思います。それ以降どうしていけばいいのか分かりません。 わかる方は証明お願いします。 ちなみにxが非負整数でm,nの最大公約数ならば、x=gcd(m,n)と表されます。

  • 約数、倍数の問題

    「0<a<150であるような整数Aがある。Aと42の最大公約数は6,Aと32の最大公約数は8であるという。このときAの個数はいくらか。」という問題があります。この問題の解説に、「Aと42の最大公約数は6=2×3であり、Aと32の最大公約数は8=23であるから、A=23×3×X=24X(Xは整数) と表すことが出来る」と載っているのですが、どうしてこう表せるのか理解できません。どなたか教えて下さい。

  • ユークリッドの互除法

    ユークリッドの互除法の処方でつまづいています。 どなたか教えて頂けませんか。 aとbは正の整数でb≦aの関係にある。 aとbの最大公約数gcd(a,b)。 この時gcd(a,b)=ax+byの解となる(x,y)のペアはいくついるのでしょうか? 直感ですと(x,y)は一つしか存在しないように感じるのですが、どうやって記述すればいいのでしょうか? よろしくお願いします。

専門家に質問してみよう