小町算のプログラムについて

このQ&Aのポイント
  • 小町算のプログラムについて
  • 小町算のプログラム中のsum、num、signの意味について解説します。
  • sumは計算結果を表し、numは現在の数値を表します。signは符号を表します。
回答を見る
  • ベストアンサー

小町算のプログラムについて

小町算のプログラムについて 100 DIM s(9) 110 FOR i=1 TO 9 120 LET s(i)=-1 130 NEXT i 140 DO 150 LET sum=0 160 LET num=0 170 LET sign=1 180 FOR i=1 TO 9 190 IF s(i)<>0 THEN 200 LET sum=sum+sign*num 210 LET sign=s(i) 220 LET num=i 230 ELSE 240 LET num=10*num+i 250 END IF 260 NEXT i 270 LET sum=sum+sign*num 280 IF sum=100 THEN 290 FOR i=1 TO 9 300 IF s(i)= +1 THEN PRINT " + "; 310 IF s(i)= -1 THEN PRINT " - "; 320 PRINT i; 330 NEXT i 340 PRINT " = 100" 350 END IF 360 LET i=9 370 LET sign=s(i)+1 380 DO WHILE ( sign > 1 ) 390 LET s(i)=-1 400 LET i=i-1 410 LET sign=s(i)+1 420 LOOP 430 LET s(i)=sign 440 LOOP WHILE ( s(1) < 1) 450 END というものですが、このプログラム中にあるsum、num、signとはどういう意味があるのでしょうか?

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

  • ベストアンサー
回答No.1

カテゴリ違いだと思われます。 * 教えて!goo > * [技術者向] コンピューター > * プログラミング > * その他(プログラミング) でお尋ねになったほうがよろしいかと。

その他の回答 (2)

  • spring135
  • ベストアンサー率44% (1487/3332)
回答No.3

小町算とは 1+2+34-5+67-8+9=100 のように1から9を順序は変えずに適宜並べてその計算結果が100になるように するもので和算の遊びみたいなものでしょう。 +、-だけでなくて×、÷を混ぜてもよいなどのバリエーションがあります。 sum=sum+sign*num という式が多く用いられていますが、numという正の整数を変化させて正負をsignで選択し これをsumに足しこんでsumが100になったらprint outするというプログラムになっています。 450 end の前にstopを入れないと結果が見れませんので、念のため。

  • htms42
  • ベストアンサー率47% (1120/2361)
回答No.2

私には「小町算」がどういうものかがわかりません。 したがってプログラムの意味も分かりません。 sum、num、signはこのプログラムを作った人が変数名として使っているものです。 関数名ではありません。変数名をどういう文字で表すかは作った人の好みです。 sum は和、num は数 の意味でしょう。 私は単にS,Nで表します。 signは符号の意味だろうと思いますが sign>1 というような式が出てきていることで言うと符号ではないような気もします。 SGNという符号関数もありますから混乱しそうですね。 LETが多くて見にくいですね。 BASICのプログラムではLETはふつう省略できると思います。

関連するQ&A

  • 十進BASICのプログラムについて

    十進BASICのプログラムについて 小町算のプログラムですが、 100 DIM s(9) 110 FOR i=1 TO 9 120 LET s(i)=-1 130 NEXT i 140 DO 150 LET sum=0 160 LET num=0 170 LET sign=1 180 FOR i=1 TO 9 190 IF s(i)<>0 THEN 200 LET sum=sum+sign*num 210 LET sign=s(i) 220 LET num=i 230 ELSE 240 LET num=10*num+i 250 END IF 260 NEXT i 270 LET sum=sum+sign*num 280 IF sum=100 THEN 290 FOR i=1 TO 9 300 IF s(i)= +1 THEN PRINT " + "; 310 IF s(i)= -1 THEN PRINT " - "; 320 PRINT i; 330 NEXT i 340 PRINT " = 100" 350 END IF 360 LET i=9 370 LET sign=s(i)+1 380 DO WHILE ( sign > 1 ) 390 LET s(i)=-1 400 LET i=i-1 410 LET sign=s(i)+1 420 LOOP 430 LET s(i)=sign 440 LOOP WHILE ( s(1) < 1) 450 END というものですが、このプログラム中にあるsum、num、signとはどういう意味があるのでしょうか?

  • 小町算(+,-のみ)のトレースです。

    小町算(+,-のみ)のトレースです。 宜しくお願いします。 アルゴリズム自体はIPAのソフトウェア開発を取得した時に 類似例をやったのでわかるのですが、設問の意図が分かりずらいです。 (1)プログラムで何種類のs(i)(i=1,2,・・・,9)について調べていますか。  ■1□2□3□4□5□6□7□8□9の小町算で、  □には+ならば(1)、空白ならば(0)、-ならば(-1)のいずれかが入る。  ただし、■だけは+(1)、空白(0)、に差異がない(例:+12=12)ので、  空白(0)、-(-1)のいずれかが入る。  下記プログラムを見ると最後から2行目のLOOP WHILE ( s(1) < 1)  で最後の処理が終わっている。つまりs(1)の配列の中は1に対する■  の部分であり、s(1)は空白(0)、-(-1)までしか処理されていない。  こう考えると解答は2^1*3^8である。    単純に考えると3^9ですが、この場合はどちらが正答なのでしょうか?  私は2^1*3^8だと思うのですが…    何と、此処には載せませんが(3)でLOOP WHILE ( s(1) < 1)についての説明を  求められるのです。出題の順番が間違ってませんか?(1)が正解すれば、(3)  は考えるまでも無い気がします。 (2)(1)による総当たりを樹形図で示せ。  2^1*3^8の樹形図を書けとおっしゃるのですか…orz  無理です。  とりあえず、■1□2□3にコンパクト化します。(でも最終的に2^1*3^2=18)ですが…    簡素化して考えて良いのでしょうか? 以下プログラムです DIM s(9) FOR i=1 TO 9 LET s(i)=-1 NEXT i DO LET SUM=0 LET NUM=0 LET SIGN=1 FOR i=1 TO 9 IF s(i)<>0 THEN LET SUM=SUM+SIGN*NUM LET SIGN=s(i) LET NUM=i ELSE LET NUM=10*NUM+i END IF NEXT i LET SUM=SUM+SIGN*NUM IF SUN=100 THEN FOR i=1 TO 9 IF s(i)= +1 THEN PRINT" + "; IF s(i)= -1 THEN PRINT" - "; PRINT i; NEXT i PRINT " = 100" END IF LET i=9 LET SIGN=s(i)+1 DO WHILE (SIGN > 1 ) LET s(i)=-1 LET i=i-1 LET SIGN=s(i)+1 LOOP LET s(i)=SIGN LOOP WHILE ( s(1) < 1) END

  • Pascal言語で小町算

    Pascal言語で、『1~9の順に数字を並べ、+、-を補い式を作り、 値が100になる組み合わせをすべて出力するプログラムを作成せよ(例:12 - 3 - 4 + 5 - 6 + 7 + 89 = 100)。』 という課題が出ました。自分なりに組んでみたのですが、 12個あると聞いたのに、4個しか出力されません><; どこが間違っているのかご教授いただけると幸いですっ ------------------------------------------------------- program KomachiZan(output); var i,s:integer; var sign:array[1..9] of integer; var x,n:longint; begin writeln('< 小町算 -Komachi Zan- >'); for i:=1 to 9 do sign[i]:=-1; repeat x:=0; n:=0; s:=1; for i:=1 to 9 do begin if sign[i]=0 then n:=10*n+1 else begin x:=x+s*n; s:=sign[i]; n:=i; end; end; x:=x+s*n; if x=100 then begin for i:=1 to 9 do begin if sign[i]=1 then write(' + ') else if sign[i]=-1 then write(' - '); write(i); end; writeln(' = 100'); end; i:=9; s:=sign[i]+1; while s>1 do begin sign[i]:=-1; i:=i-1; s:=sign[i]+1; end; sign[i]:=s; until sign[1]>=1; end. -------------------------------------------------------

  • プログラムの意味がわからなくて困っています

    こんにちは。以下のプログラムの意味がわからなくて困っています。分数q/p(p、qはともに正の整数)に関係するもので、3/13を入力したときの出力と、配列R()がどんな変化をしていくかを教えてください。 100 option base 0 110 dim A(1000) 120 dim R(999) 130 let N=1000 140 for I=0 to N-1 150 let R(I)=0 160 Next I 170 do 180 print"分母p="; 190 input P 200 if (P>N) then 210 print"分母は1000以下にしてください” 220 end if 230 loop while(P>N) 240 print"分子q="; 250 input Q 260 let A(0)=int(Q/P) 270 let Q=mod(Q,P) 280 let K=0 290 Do 300 let K=K+1 310 let R(Q)=K 320 let Q=Q*10 330 let A(K)=int(Q/P) 340 let Q=mod(Q,P) 350 loop while (R(Q)=0) 360 print A(0);"."; 370 for I=1 to R(Q)-1 380 print A(I); 390 next I 400 if (R(Q)<K) or (A(K)<>0) then 410 print "{"; 420 for I=R(Q) to K 430 print A(I); 440 next I 450 print"}"; 460 end if 470 end 100から160までで配列Aを1000個、配列Rを999個準備し、配列Rの中身を0にしている。 170から230で分母Pに13を入れ分母が1000以下になることを確認している。1000以上であれば、1000以下になるまでループ内を繰り返す。 240以下で分子を入れているようですが、ここからよくわからなくなってしまいました。 よろしくお願いします。  

  • basic プログラムです。

    100 DIM A(5) 110 FOR J=1 TO 5 120 READ A(J)   130 NEXT J   140 FOR I=1 TO 4  150 LET K=1    160 FOR J=I+1 TO 5  170 IF A(J)<A(K) THEN LET k=J  180 NEXT J    190 LET T=A(I)    200 LET A(I)=A(K)   210 LET A(K)=T    220 FOR J=1 TO 5   230 PRINT A(J);   240 NEXT J     250 PRINT      260 NEXT I     270 DATA 5,3,7,2,1,  280 END を実行すると 13725 31725 31275 71235 という数字が出てきます。 どうしてこのような結果が出るのか 解説をお願いします。

  • basicプログラムです。

    100 DIM A(5) 110 FOR J=1 TO 5 120 READ A(J)   130 NEXT J   140 FOR I=1 TO 4  150 LET K=I    160 FOR J=I+1 TO 5  170 IF A(J)<A(K) THEN LET k=J  180 NEXT J    190 LET T=A(I)    200 LET A(I)=A(K)   210 LET A(K)=T    220 FOR J=1 TO 5   230 PRINT A(J);   240 NEXT J     250 PRINT      260 NEXT I     270 DATA 5,3,7,2,1,  280 END このようなプログラムがあります。 いろいろ調べたのですがそれぞれの文の意味と 何を求めるプログラムか教えて下さい。 5つの数の組み合わせで小さい数から順番に4個 かなと思ったのですが???

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

    このプログラムは何をするものか詳しく説明しなさい。 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や考え方だけでも教えていただけないでしょうか。

  • 行列に関するプログラムについて

     『m×n 型行列Aの最大成分と最小成分を捜し、それぞれの行番号と列番号を出力するプログラムを作れ』という問題です。  以下のようにBACICで考えたのですが、うまく行番号と列番号を出力するプログラムを作れません。アドバイスいただければと思います。宜しくお願い致します。 100 INPUT m 110 INPUT n 120 DIM A(m,n) 130 MAT INPUT A 140 FOR i=1 TO m 150 FOR j=1 TO n-1 160 LET s=A(i,j) 170 LET t=A(i,j) 180 IF A(i,j)<A(i,j+1) THEN LET s=A(i,j+1) 190 IF A(i,j)>A(i,j+1) THEN LET t=A(i,j+1) 200 NEXT j 210 NEXT i 220 PRINT "最大成分は";s,"最小成分は";t

  • 数学におけるプログラムの問題です。

    「次のプログラムは何をするものか説明し、nに360が入力されたときのp,qを求めよ。   100 INPUT n     110 FOR i=1 TO SQR(n)   120 IF MOD(n,i*i)=0 THEN LET p=i   130 NEXT i   140 LET q=n/(p*p)   150 PRINT "p=";p   160 PRINT "q=";q    END」 という問題です。  p=6,q=10 はわかります。このプログラムは「入力された値に対して、2乗して割り切れる最大の値とその時の商を求めるものである」でよろしいのでしょうか?

  • BASIC言語で整数を素因数分解するプログラムを教えてください

    結果が表示されません。間違い箇所を教えてください 使用コマンドはbwbasicです 100 PRINT "N? (N>2)" 101 waru=2 102 kazuhantei=0 103 pastwaru=0 104 kaisu=1 105 hatsu=1 110 INPUT object 120 DO 130 IF object<2 THEN 140 PRINT "N? (N>2)" 150 INPUT object 160 ELSE 170 kazuhantei=1 180 END IF 190 IF kazuhantei<>0 THEN 200 GO TO 250 210 ELSE 220 GO TO 130 230 END IF 240 LOOP 250 PRINT "soinsubunkai suruto" 260 object=0 270 DO WHILE object<>1 280 IF object MOD waru=0 THEN 290 IF pastwaru=waru THEN 300 kaisu=kaisu+1 310 END IF 320 IF kaisu>1 THEN 330 PRINT "^";kaisu 335 END IF 340 kaisu=1 350 IF hatsu=0 THEN 360 PRINT "*";waru 370 pastwaru=waru 380 END IF 390 hatsu=0 400 object=object/waru 410 END IF 420 ELSE 430 waru=waru+1 440 object=object+1 445 LOOP 450 IF kaisu>1 THEN 460 PRINT "^";kaisu 465 END IF 470 END