最後の数は?

このQ&Aのポイント
  • n個の数を並べ、3つめの数ごとに消していき、最後に残る数はいくつか?この問題の解き方を思い出せません。
  • 既存のBasicプログラムを参考にして解き方を考えましたが、なぜこのような解き方になったかわかりません。
  • 解答方法に関するアドバイスを求めています。基本的なプログラムのロジックを活かした方法が理想です。
回答を見る
  • ベストアンサー

最後の数

以前Basicの勉強をしていたときに 課題で出された問題なのですが… (部屋を掃除していたらノートに問題とソースが書かれていて…) 問題は 「n個の数を並べ、3つめの数ごとに消していく。 で、最後に残る数はいくつか」というものです。 例)5個の数「1.2.3.4.5」として  fir→1.2.4.5 sec→1.2.5 thi→1.2 for→2 といった感じですf^^; で、basicのプログラムは 100 input "number of people =" ; a 110 N=3*a 120 if N>a then goto 140 130 goto 180 140 C=(N-a-1)/2 150 C=int(C) 160 N=C+N-a 165 print N;","; 170 goto 120 180 print "J3(";a;")=";N 190 end という風になっていたのですが、どうしてこういった 解き方になったのかがどうしても思い出せません。 (なさけないですねf^^;) だれかわかる方がいたらアドバイスをお願いします。 (できればこのプログラムにそったやり方だと良いのですが…)

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

  • ベストアンサー
noname#33973
noname#33973
回答No.4

ようやく判りました(激遅 「最後に残る数はいくつか」 というのはミスディレクション(ひっかけ)で、 「最後に消える数はいくつか」 を考えると良いようです。 例えば、a=5のとき、 第12カウントで「2」が消えた時点で最後に残る数「4」が決まりますが、「4」が消えるまでカウントするとします。 最初にa個の数があって、3カウント毎に1減り、最終的に0個になるので、総カウント数は3*aになります。 これが最初のNです。 さて、例えば、a=5のときどのようにカウントするかを列挙すると、 数列A:1,2,3,4,5,1,2,4,5,2,4,2,4,4,4 となります。 プログラムが表示する、 15,14,13,11,8,4 という数列は、数列Aにおける最後に消える数「4」の位置を表しています。 プログラムは、これを使って右から、最後に消える数の位置を計算しているのです。 …大雑把で申し訳ありませんが、終業時間になりましたので、とりあえず方針だけ。

syosin
質問者

お礼

遅くなって申し訳ありません。ありがとうございます m(_ _)m えっと…なんとなくですが理解できたので、 似たような例をいくつか解いてみて、 あとは自己解決できるようにしたいと思います ありがとうございました☆

その他の回答 (3)

noname#33973
noname#33973
回答No.3

あ、ごめんなさい。剰余系云々の話はなし(滝汗

noname#33973
noname#33973
回答No.2

…ですね。 そういう解釈でよければ、 これは一般に「継子立て」と呼ばれる問題になります。 (「継子立て」・「継子立」で検索すると多少ページがあります) 継子立ての解法は、たしか、剰余系ごとに取り除いていって、それから、え~っとぉ、ツメが良く判りません(ぉぃ プログラムが何やってるかもいまだ不明です。 もう少し考えてみますので、しばらくお待ちを(汗 (その前に別の方から回答がつくかも…)

noname#33973
noname#33973
回答No.1

課題の解釈、違いません?? “例”のように解釈すると、nがどんな値でも2が残ると思うのですが…。 一方、プログラムの方は、例えばnが6のとき1を返します…と思います(ぉぃ

syosin
質問者

補足

はい、まちがえました(-_-; えっと5個の数1.2.3.4.5として fir→1.2.(3).4.5 「3が消えます。」 sec→(1).2.4.5 「firの3から数えて3つめなので1が消えます。」 thi→2.4.(5) for→(2).4 で、答えが4…と(-_-;) >一方、プログラムの方は、例えばnが6のとき1を返します…と思います そう、nが6のときは1であってます。この解釈の仕方が知りたかったのです。ほんとスイマセン(-_-;)

関連するQ&A

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

    添付の図のようなフローチャートを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が出力されるのでおかしな気がします。 解答が正しいのでしょうか?それとも間違っているのでしょうか?

  • 素数は何%くらいあるか

    高1です。 素数が何%くらいあるかを調べてみようと思い、次のようなBasicプログラムを作りました。 -------------------------------------------------------- 100 cls:count=1:print 2;" ";100;"%";" ";count 110 for i=3 to 10000000 120 n=i 130 if (n - int(n/2)*2) = 0 then goto 220 140 for j = 3 to sqr(n) step 2 150 if (n - j * int(n/j) ) = 0 then goto 220 160 end if 170 next j 180 count=count + 1 190 p = count*100 / (n - 1) 200 percent = (int(p * 10))/10 210 print n;" ";percent;" ";"%";" ";count 220 next i 230 end -------------------------------------------------------- 【各行の意味】 100  2は素数 110  3から一千万まで調べる 130  偶数は除外 140~ 素数判定(自然数nが√n以下のすべての数で割りきれなければ、nは素数である、を利用) 180  素数の個数をカウントする 190~ 素数が何%あるかを少数第一位まで求める。少数第二位以下は切り捨て。 210  素数、%、素数の個数 を表示 -------------------------------------------------------- 【結果】 千までに素数は168個、16.8% 一万までに素数は1229個、12.3% 十万までに素数は9592個、9.5% 百万までに素数は78498個、7.8% 一千万までに素数は664579個、6.6% -------------------------------------------------------- そこで質問ですが、 1.素数の割合は収束する傾向にあると言えるでしょうか? 2.プログラムに間違いがありましたら、教えていただけないでしょうか。 3.素数の割合に関するわかりやすい本(高校生でも理解できるようなもの)などがありましたら、教えていただけないでしょうか。 ちなみに、これは学校の宿題や課題ではありません。純粋に個人的な興味で調べたものですが、何か結論みたいなものが導けたら来年の自由研究に出してみたいと思っています。 使用機種:Mac 使用ソフト:chipmunk basic(フリーソフト) 機種が非力なので1億や10億といった計算はやっていません。

  • カシオのポケコンのプログラム作成について

    カシオのポケコン(Z-1GR)のBASICでプログラムを作成する際に Enterキーを押した場合と数値を入力した場合で分岐させたいのですが、やり方がわかりません。 例えば Aを入力、Bを入力すると、C=A+BでCの答えを表示させる。 ただし、Bの入力時に何も入力しないで、そのままEnterキーを押すと、C=0と表示させる と言った感じです 10 INPUT"A=",A 20 INPUT"B=",B 30 IF B="" THEN GOTO 40 ELSE GOTO 50 40 PRINT"C=0" 50 C=A+B 60 PRINT"C=";C:GOTO 20 どなたかわかる方いらっしゃいませんか?

  • n88basicのプログラムを十進ベーシックに翻訳してください。

    n88basicの次のプログラムを十1進ベーシックではどうなるのか教えてください。 10 cls 20 p=1000 30 for n=1 to 1000:next n 40 p=p-1 50 if p=-1 then end 60 locate 10,10:print p 70 goto 30

  • 2進→10進数

    2進数から10進数に変換するプログラムを作りたいんですが #include<stdio.h> main() { int a[8],i=0,ans=0,end; start: printf("2進数を10進数に変換するプログラム\n開始する場合は1を入力終了する場合は0を入力してください。\n"); scanf("%d",&end); if(end==1) { goto s1; } else if(end==0) { goto end; } { s1: for(i=0;i<8;i++) { scanf("%d",&a[i]); } for(i=0;i<8;i++) { a[i]=2^i; } for(i=0;i<8;i++) { ans=ans+a[i]; } printf("二進数"); for(i=8;i<=4;i--) { printf("%d",a[i]); } printf(" "); for(i=4;i<=0;i--) { printf("%d",a[i]); } printf("は%dです。\n",ans); goto start; } end: printf("終了します\n"); } 期待した結果が得られないのですがどこが違っているのか教えていただきたいです、お願いします。

  • カシオのポケコン プログラム作成について

    先ほど同じ質問をしたのですが、質問の仕方が悪く意図した回答が得られなかったので、 再度質問します。 カシオのポケコン(Z-1GR)のBASICでプログラムを作成する際に Enterキーを押した場合と数値を入力した場合で分岐させたいのですが、やり方がわかりません。 例えば Aを入力、Bを入力すると、C=A+BでCの答えを表示させる。 ただし、Bの入力時に何も入力しないで、そのままEnterキーを押すと、C=0と表示させる と言った感じです 10 INPUT"A=",A 20 INPUT"B=",B 30 IF B="" THEN GOTO 40 ELSE GOTO 50 40 PRINT"C=0":GOTO 20 50 C=A+B 60 PRINT"C=";C:GOTO 20 上のライン30の指示がうまく実行しません。 「B="" THEN GOTO 40」の部分だと思うのですが この部分 (そのままEnterキーを押すとライン40に進む)をどのようにすればよいか 教えてください。 どなたかわかる方いらっしゃいませんか?

  • 最小公倍数最大公約数

    WindowsN88BASICのプログラムについてしつもです。 自然数a、b、cをインプットしa、b、cの最小公倍数と最小公倍数を出力するBASICプログラムを作りたいのですが、教えていただけますか? cプログラムでは同じ事をできたのですが、最近BASICを始めたので考え方等と共に解説お願いします。

  • pythonでフィボナッチ数カウントを行いたいのですが...

    pythonで、入力された二つの数字によるrange(a, b)内からフィボナッチ数の数をカウントするプログラムを書きたいのですが、どのように書けば良いでしょうか?因みに、今のところ a=int(raw_input("Enter the minimum valuer:")) b=int(raw_input("Enter the maximum value:")) def fib(n): if n <= 0: n = 0 elif n == 1: n = 1 else: n = fib(n-1) + fib(n-2) return n for i in range(a, b+1): まで書いてみたのですが、この後どうしたら良いかわからなくなってしまいました。 初歩的な質問なのですが、どうかご回答よろしくお願いします。

  • 数学の問題 場合の数と漸化式

    数学の問題 数字1,2,3をn個並べてできるn桁の数全体を考える。そのうち1が奇数回現れるものの個数をa(n)、1が偶数回現れるか全く現れないものの個数をb(n)とする。 a(n+1)、b(n+1)をa(n)、b(n)を用いて表せ。 という問題です。 説明された考え方 a(n+1)について 1が奇数回現れている数の一番左に1桁の数を加えるとすると 1が奇数回でないといけないから2か3である。 よって、2a(n) 1が偶数回現れている数の一番左に1桁の数を加えるとすると 1が偶数回でないといけないから1である。 よって、b(n) 以上より、a(n+1)=2a(n)+b(n) 同様にして、b(n+1)=a(n)+2b(n) が答えです。 解説を聞く前に自分で考えたその考え方は同じでした。 n桁の数に1桁の数を加えるというやり方です。 しかし、計算が違いました。 説明では、「一番左に1桁加える」として計算していますが 最初、n桁の数の場合、その数と数の間はn+1あるから そのn+1の間から一か所選んで、そこに2か3を入れる、そしてそれがa(n)個あるから a(n+1)=(n+1)C1 * 2 * a(n) + (n+1)C1 * 1 *b(n) を計算しました。 何がいけないのでしょうか? 一番左に加えると決めつけてしまってもいいのでしょうか? お願いします。

  • 場合の数について

    1,2,3,4の4種の数があり、これをn個つかって並べてできる数で、1が奇数個入っているものをa(n)とする。 この時、a(n+1)をa(n)を用いて表せ。 という問題がありました。 n+1個で1が奇数個入っているには、n個のときに、1が奇数個あって、もう一数を2、3、4から選び、また、1が偶数個あるときもう一つ1を加えて1が気数個になるように計算しようと思ったのですが、数が重複していることもあるので、n個の数の間n+1箇所に新たな数を入れるという考えではいけません。 どのように計算したらよいでしょうか?