ただし、4または13を含む数字は除外します。4*、13*なども除外します。1*3のように、13の間に4以外の数字が入る場合は除外しません。このとき、
(1)1000番まで番号をつけるには、最低何台分のスペースが必要ですか。
(2)1000台ぶんの駐車スペースに番号をつけたら、一番大きな数字は何ですか。
(1)
普通の9進数に変換(4以上の位を-1する)
1000→1000
10進数に変換する。
1*9*9*9+0*9*9+0*9+0=729
*13、13*の個数を引く。
729-9-9=711
→711
(2)
1000に、2000までの**13、*13*、13**の個数を足す。
1000+2*9+2*9+81-1=1116
普通の9進数に変換
1116/9=124*9+0
124/9=13*9+7
13/9=1*9+4
→1470
さらに4無し9進数に変換(4以上の位を+1する)
→1580
除外しすぎた**13(1613、1713、1813、1913)を戻す
1580-4=1576
→1576
「YOUスクリプトごと書いちゃえよ」ですよ。
そんなもんかな :-)
無粋を承知で、プログラムという反則技を。
n = 1 nn = 0 while true if /(4|13)/ !~ n.to_s then nn += 1 end if n == 1000 or nn == 1000 then puts "n=#{n} : #{nn}" exit if nn == 1000 end n += 1 end
求まった答え。
n=1000 : 711 n=1576 : 1000
Python とかだと reduce 使うのかな(リクエストしてます :-)。
筆算で解くとしたら、場合分けで引いていくのかな、と思うのですけれど、中々答えが合わないのは内緒だ。
# 飲み過ぎかな
(1)1000番まで番号をつけるには、最低何台分のスペースが必要ですか。
***4
10^2 = 100
**4* : ***4 を除く
10^2 - 10^1 = 90
*4** : **4* と ***4 を除く
10^2 - 10^1 - (10^1 - 1) = 81
**13 : *413 を除く
10^1 - 1 = 9
*13* : *134 を除く
10^1 - 1 = 9
10^3 - 100 - 90 - 81 - 9 - 9 = 711
# なぽりんさんの考え方の方が、ぐっとスマート
つぎは1abcか… 289個数えるのも面倒だしグラフも同じことだし…うわっめんどくさいなこれ。711からの増加予定数289におよそ3割たして、しかも1300台は連続100個除外だから、1500からカウントアップの見当をつけるくらいですねえ
試験問題の類だとしたら、(2) の解き方は (1) の延長線上にあるのだと想像しますけど、さっぱりアイデアが浮かんできません (´・ω・`)
上の方と同じ結果を得ました。o(^-^)o
(1) 711
(2) 1576
計算に使ったプログラムはこちらです。(^_^;
皆さん、正規表現を使っているようなので、私も正規表現でやってみました。(^_^;
# coding: UTF-8 # ParkingSpc2.py import re def main(): cnt = num = 0 while cnt< 1000: num+=1 if re.search(r'4|13',str(num)): continue cnt+=1 if num==1000: print '(1)',cnt print '(2)',num if __name__ == '__main__': main()
なんだか申し訳ない感のあるやつです
var count1 = 0; //現在の台数 var count2 = 1000; //欲しい台数 var i = 0; do { i++; if (/(4|14?3)/.test(i) == 0) { count1++; //console.log(i); 詳細表示 }; if (i === 1000) {//1000番目までの台数 console.log('Ans1 = ' + count1); } } while (count1<count2); console.log('Ans2 = ' + i); console.log('result = ' + count1);
Ans1 = 711
Ans2 = 1576
result = 1000
4? は、要らなくないですか?
プログラム的には /(4|13)/.test(i) で全く問題無いのですが(1と3の間でも、4単体にチェックが入る)、
問題に対する解答を説明する為に、まずは質問文をそのまま仕組みに変える方法が良いかな という申し訳ない感があるものです。
#言い訳を考える
(1)
あおったので回答かきます。
場合分けでやると、000~999の3桁の数字のどこにも4が出ないグループの数は9の3乗で729です。
(これは、abcという三桁の数字のaの候補の数とbの候補の数とcの候補の数を掛ける行為です)
次に、13が入ってるグループをもとめます。合致する数は3桁では13*と*13だけで、かつ*=4はすでに除かれています。
したがって*は9個しか候補がないので、13*が9個、*13が9個の合計18個。
729から18をひいて711です。(ワクは1から順番ですので、000という名前のワクは除外して、かわりに1000という名前のワクを足すので合計のワクの数は変わらず711です。)
(2)
1~1000の名前をもつワクの個数は711とわかっているので1001~の名前で289個のワクが追加で必要です。
1000~1999のワクの名前を1abcという変数としてあつかいます。
(2)で求める最大の1abcは1499であろうと適当に予測します(さっきといた(1)で、3割くらいは消えることがわかっているから逆に289から10/7=1.5倍強、カサマシしておくというわけです)。これを検算します。
000~499のなかの4が入らない数字は(5-1)×(10-1)×(10-1)=324個あります。aの位の候補とbの位の候補とcの位の候補をかけあわせてるだけです。(289より大きくてちょっと安堵。)
そして13について考えます。aの位には、4のほか、3も入ってはいけない(aに3を代入すると13bcという名前を持つ駐車ワクができるため)ので、さっきの式を訂正します。(5-2)×(10ー1)×(10-1)は、243個あります。このグループには4が入った数字と13bcの数字が入っていませんが1a13や113cの形の不純物はまだ残っています。(おっと、ここで289より小さくなってしまった。どうやら1499の予測は小さすぎなのであわてて上方修正すべきかもしれないのですが、いやいやあわてずにこのままやってみましょう。)
1a13は、aが0~4のうち、3,4はつかえない(もう除いた)ので、残っている不純物のワクは1013,1113,1213の3つだけですね。3個除きましょう。
113cはc候補が0~9のうち4が既に除かれているので9個除きましょう。
あわせて12個の不純物を除くことで、1000~1499の間の使えるワクの数は243-3-9で231だとわかります。これを711に足すときには1000番ワクを重複カウントすることになるので1を引く。1499までの名前をもつワクの総数は941であります。のこり59個あればちょうど1000個のワクがつくれます。
今度は1500~1599から59個のワクを調達する件ですが、これはもう簡単です。bが1すすむごとに9個のワクが追加されます。4抜きの9進数になっています。59/9の答えは10進法で6あまり5。途中で1513をも不使用にするので、あまりに1つたして、6。6あまり6を4抜きの9進数で表現するとこうなります。77。したがって1499に77を足して1576が答え。あってたかな。
答えが11bcになるような問題であると最後のほうがもうすこしややこしそうです。
おおむね、1000を4抜き9進数で表現した上で、http://www2.odn.ne.jp/~aai55890/yosi/sinnhou.htm
その範囲内にあるza13やz13c、13bcを積み上げていくほうがスマートかなーとおもいます。
回答ありがとうございます。
たいへん丁寧な解説で、とてもわかりやすいです。
これって機械的に解いたら楽勝かなと、うすうす予想しつつも、断りをいれずに出題したら、ホントに瞬殺でしたね。「学習・教育」カテゴリなのにちょっと大人げないんじゃないですか皆さま。…いや、大人だからこそ機械的に処理するのか (笑
とか何とか言いつつ、プログラムで解を求めたらこうなるのかと知れて興味深いです。ありがとうございます。
紙と鉛筆で解くほうはいかがでしょう。No.4のなぽりんさん(id:NAPORIN) が結構いい感じに解いてくださってますが、これを超える綺麗な解はありますか?(挑発
(1)
普通の9進数に変換(4以上の位を-1する)
1000→1000
10進数に変換する。
1*9*9*9+0*9*9+0*9+0=729
*13、13*の個数を引く。
729-9-9=711
→711
(2)
1000に、2000までの**13、*13*、13**の個数を足す。
1000+2*9+2*9+81-1=1116
普通の9進数に変換
1116/9=124*9+0
124/9=13*9+7
13/9=1*9+4
→1470
さらに4無し9進数に変換(4以上の位を+1する)
→1580
除外しすぎた**13(1613、1713、1813、1913)を戻す
1580-4=1576
→1576
回答ありがとうございます。
すっきりして見やすい答だと思います。
おや、こんなシンプルな計算でいいのかと不思議な感じ。
回答ありがとうございます。
2016/02/22 15:54:01すっきりして見やすい答だと思います。
おや、こんなシンプルな計算でいいのかと不思議な感じ。