ユークリッドの互除法とは?求まるべき空欄について

このQ&Aのポイント
  • ユークリッドの互除法は自然数xとyの最大公約数を求めるためのプログラムです。
  • センター試験の問題では130~150行目が空欄になっていて、その部分に当てはまるものは何か問われています。
  • ユークリッドの互除法では、130行目から150行目は以下のようになります。LET Z=X、LET X=Y、LET Y=Zとなります。この部分は考えて求める必要があります。
回答を見る
  • ベストアンサー

08年センター試験本試数学Bコンピュータ

以下はユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラムです。 センター試験の問題では、130~150行目が空欄になっていて、その部分に当てはまるものは何か問うていました。 私は勉強不足で、高校で学ぶコンピュータプログラミングを知りません。 ユークリッドの互除法といえば、130~150行目は 130 LET Z=X 140 LET X=Y 150 LET Y=Z と、即答できねばいけないものなのでしょうか。 それともこの部分は考えて求められるものなのでしょうか。 もし後者であれば、その考える道筋を解説していただきたいです。 100 INPUT "x=";X 110 INPUT "y=";Y 120 IF X<Y THEN 130 LET Z=X 140 LET X=Y 150 LET Y=Z 160 END IF 170 IF Y=0 THEN 180 PRINT X 190 GOTO 270 200 END IF 210 LET R=X 220 LET R=R-Y 230 IF R>=Y THEN GOTO 220 240 LET X=Y 250 LET Y=R 260 GOTO 170 270 END

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

  • ベストアンサー
  • FT56F001
  • ベストアンサー率59% (355/599)
回答No.2

BASICというプログラム言語を一通り勉強していなければ,この問題は難しいです。 たたし,ある程度の数学の素養がある人なら,BASICの文法はすぐに(数日?)覚えられます。 ご質問のプログラムは以下の内容です。 100-110 2数X,Yを入力する。 120-160 必要なら2数を入れ替えて,X≧Yとなるようにする。 170-200 Y=0だったら,答えをXとして,停止する。 210-230 XからYを何回か引き,X÷Yの余りをRとする。 240-260 Y,Rを新しい2数X,Yとして,170以下を繰り返す。 先の回答者さんから解説あったように, 130-150はXとYを入れ替える操作です。 これは,一種のテクニックなので 「覚えておく」性質のものでしょう。 あと,数学を知っている人が,プログラム言語を学ぶときに混乱するのが,代入文です。 LET A=B という文は,右辺Bを計算した値を,変数Aに代入する。 という操作を表します。 古典的なBASICでは LET を付けるので,変数AをBと等しくせよ, の意味がまだ分かりやすいですが, 単に A=B と書いて代入を表す言語もあります。

その他の回答 (1)

  • info22_
  • ベストアンサー率67% (2650/3922)
回答No.1

>即答できねばいけないものなのでしょうか。 まず「ユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラム」 この互除法の仕組みが分かっていることが前提です。分かっていなければ、即答など無理でしょう。分かっていれば、該当の3行で、どういう操作をすればいいかは、即答できないといけないでしょうね。つまり、「XとYの内容を交換する」操作だと分からないといけないですね。 >それともこの部分は考えて求められるものなのでしょうか。 「XとYの内容を交換する」操作だということは考えて求められる以前の問題ですね。すぐ分からない(思い出さない)といけないですね。 >もし後者であれば、その考える道筋を解説していただきたいです。 「XとYの内容を交換する」操作は、直接出来ないので、一時的に第3の変数(ここではZだが、他の変数でも良い)を仮の置き場(記憶場所)を使って、交換します。これは良く使われる操作です。 >130~150行目は >130 LET Z=X >140 LET X=Y >150 LET Y=Z >と、即答できねばいけないものなのでしょうか。 即答できないと駄目ですが、答えは1通りではありませんね。 130 LET Z=Y 140 LET Y=X 150 LET X=Z 130 LET W=Y 140 LET Y=X 150 LET X=W など でも良いでしょう。

関連するQ&A

  • プログラミングの問題です

    このプログラムは何をするものか詳しく説明しなさい。 100 FOR x=1 TO 100 110 FOR y=x TO 100 120 LET a=x 130 LET b=y 140 DO 150 LET r=MOD(a,b) 160 IF r=0 THEN EXIT DO 170 LET a=b 180 LET b=r 190 LOOP 200 IF b=1 THEN 210 LET z=SQR(x^2+y^2) 220 IF INT(z)=z THEN PRINT x,y,z 230 END IF 240 NEXT y 250 NEXT x プログラムに関して初心者で、120~230(ほとんどですが…)の部分で何をしようとしているのかが分かりません。何か参考になるHPや考え方だけでも教えていただけないでしょうか。

  • VBA と JIS Full BASIC

     下のJIS Full Basic スタイルとだいたい同じようなコードを VBA で書いたのですが   Z = Sqr(x^2 + y^2) のところでエラーが出ます。どこがおかしいのでしょうか。 Function gcd(a, b)   Do While b <> 0    r = a Mod b    a = b    b = r   Loop   gcd = a End Function Rem 既約なピタゴラス数を求める Sub Pythagoras()  LAST = 200   LAST = 200   For x = 1 To LAST    For y = x + 1 To LAST      Z = Sqr(x^2 + y^2)      'ここでコンパイルエラーが出る      If Int(Z) = Z Then       If gcd(x, y) = 1 And gcd(x, z) = 1 And gcd(y, z) = 1 Then         Debug.Print x & ", " & y & ", " & z       End If      End If    Next y   Next x End Sub ---------------------------- JIS Full Basic スタイルのコード REM ピタゴラス数 FUNCTION gcd(a,b)   DO WHILE b <> 0    LET r = MOD(a,b)    LET a = b    LET b = r   LOOP   LET gcd = a END FUNCTION LET LAST = 200 FOR x = 1 TO LAST   FOR y = x + 1 TO LAST    LET z = SQR(x^2+y^2)    IF INT(z) = z THEN      IF gcd(x,y) = 1 AND gcd(x,z) = 1 AND gcd(y,z) = 1 THEN       PRINT x,y,z      END IF    END IF   NEXT y NEXT x END

  • Maltabについて3

    2変数の極地問題について、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 次のzがなる時のxとyは? z=-x^2+5x-2y^2+2y+2 (以下のページ http://www8.plala.or.jp/uemura/sim2.html を参照しています。) DOUBLE PRECISION X,Y,H,MAXZ,Z1,Z2,Z3,Z X=0 !xの初期値 Y=0 !yの初期値 H = 0.1 !ステップ幅 MAXZ = -100000 100 Z1 = Z(X, Y) Z2 = Z(X + H, Y) Z3 = Z(X, Y + H) IF (Z2.GT.Z1.AND.Z2.GT.Z3) THEN  MAXZ = Z2  X = X + H  GOTO 100 END IF IF (Z3.GT.Z1.AND.Z3.GT.Z2) THEN  MAXZ = Z3  Y = Y + H  GOTO 100 END IF IF (Z1.GE.Z2.AND.Z1.GE.Z3) THEN  H = H / 10  IF (H.GT..000001) GOTO 200  GOTO 100 END IF 200 WRITE(*,*) 'X*= ', X WRITE(*,*) 'Y*= ',Y WRITE(*,*) 'Z*= ',Z1 END DOUBLE PRECISION FUNCTION Z(X,Y) DOUBLE PRECISION X,Y Z=-X**2+5*X-2*Y**2+2*Y+2 END これを実行すると次の解が求まる。 X*= 2.500000037252903 Y*= 5.000000074505806E-001 Z*= 8.749999999999998

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • Basicのプログラミングについて… (game)

    箱の上から自然に落ちるようにするにはどうすればよいのでしょうか? SET bitmap SIZE 500,500 SET WINDOW 0,10000,10000,0 LET x=5000 LET y=5000 LET jsw=0 DO UNTIL getkeystate(13)<0 PLOT LINES:0,5000+110;10000,5000+110 PLOT LINES:6000,4000;7000,4000 PLOT LINES:6000,4000;6000,5000+110 PLOT LINES:7000,4000;7000,5000+110 SET AREA COLOR "white" DRAW disk WITH SCALE(100)*SHIFT(x,y) IF getkeystate(37)<0 THEN LET x=x-50 IF getkeystate(39)<0 THEN LET x=x+50 IF x<0 THEN LET x=0 IF x>10000 THEN LET x=10000 IF getkeystate(38)<0 AND jsw=0 THEN LET jsw=1 LET i=-SQR(2500) END IF IF jsw=1 THEN LET y=i^2+2500 LET i=i+1 IF i>SQR(2500) THEN LET jsw=0 end if if i>0 then if 6000<x and x<7000 then if 4000-140<=y THEN LET jsw=0 end if end if end if if i>0 then if 6000>x then LET y=i^2+2400 IF i>SQR(2500) THEN LET jsw=0 end if end if SET AREA COLOR "black" DRAW disk WITH SCALE(100)*SHIFT(x,y) WAIT DELAY 0.01 LOOP END

  • 整数でないとき

    10 INPUT X 20 IF X=0 THEN END 30 C=X-2*INT(X/2) 40 IF C=0 THEN PRINT”偶数” ELSE PRINT”奇数” 50 GOTO 10 というプログラムはXが整数でなければ奇数と判定してしまいます。20行と30行の間に命令を追加して、Xが整数でないときは”整数でない”と表示して、次の入力を待つように修正し、整数のときだけ奇数か偶数かを判定するようにするには、 25 IF X^2>INT(X^2) THEN PRINT”整数でない”:GOTO 10 を追加する。 でよいのでしょうか? ぜひ教えてください。 

  • fortran  繰り返しループから抜きたい

    10 continue   :   :   :  do 100 i=1,10 if (abs(x (i)-y(i)) .lt. 1.0) then r= r + dr goto 100 else goto 1000 end if 100 continue :   : : 1000 contiue end   すべての条件(i=1~10)が満足されたら、ループから抜きたいのですが、出来ませんでした。   教えて頂けませんでしょうか?よろしくお願しますね!*<>*!

  • 空欄に不等号が入るのですが・・・

    添付の図のようなフローチャートをbasicでプログラムすると次のようになる 130行目の空欄を等号ないし不等号ないし等号つき不等号で埋め 条件式を完成させよという問題がありました。 100 INPUT N 110 FOR I=1 TO N 120 LET A=I 130 IF (A+1)^2 (空欄) N THEN GOTO 190 140 NEXT I 150 IF A<=1 THEN GOTO 190 160 PRINT A 170 LET N=N-A^2 180 IF N>=1 THEN GOTO 110 190 END ここで入れるべきものはA^2がNを「超えない」なので>=ですよね? 解答を見ると>となっているのですが 解答の条件式でN=4として実行すると2が出力されるのでおかしな気がします。 解答が正しいのでしょうか?それとも間違っているのでしょうか?

  • ユークリッドの互除法

    二つの整数a,bの最大公約数dを、ユークリッドの互除法で求める方法は分かります。 そうして求めたdは、適当な数x,yを使い、d=ax+byで表せることも何とか分かります。 しかし、d=ax+byが与えられたとき、ユークリッドの互除法を使って、特殊解xとyをどうやって求めたらよいのかが分かりません。 これまでの書き込みを見ても理解ができませんでした。 どなたか分かりやすくお教えください。

  • VB IF なぜ構文エラーにならないのですか?

    Dim x, y, z As Integer x = 1 y = 1 z = 1 If x = y And y = z Then MessageBox.Show("OK") End If 3つの値が同じならアラートを出したいのです。このソースでできるかとおもいます。。。 しかし・・・・ If x = y = z Then MessageBox.Show("OK") End If とするとアラートが出ません。関数的に使い方が間違っているのでしょうか? もしそうならなぜ構文エラーが出ないのでしょうか? よろしくお願いします。 言語Microsoft Visual Basic 2008 Express Edition