問題No.12374 【論理/パズル】ヘキサ星人との遭遇
出題者:kikki◆[4d5b6fa]
これは遠い未来の話…、何処か遠くの星からヘキサ星人と名乗る宇宙人がやってきました。そして私達はやがて共同生活を営むようになり、ヘキサ星との貿易も始まるようになりました。
しかし私たちが共生するにはちょっとだけ困った問題がありました、それは「数」の数え方が異なる点です。
私達は十進法を使って数を数えています、それは両手の指の数が10本であることに由来しているそうです(だと出題者は聞いた)。
しかし彼らの両手の指の数は12本(片手に6本づつ)なので、彼らは十ニ進法を使って数を数えます。勿論、進法が異なろうが素数は素数ですし、無理数は無理数だし、円周率は円周率です。
けれども例えば7×1=7 7×2=14 7×3=21などとやっていた九九は十ニ進法では破綻しますし(7×1=7 7×2=12 7×3=19…)。金銭の計算にしても、十進法を使う我々と十ニ進法を使う彼らとでは非常に換算が面倒となっています。
問題:
勿論、ヘキサ星人は使ってる文字が違うので、我々が0〜9を使うのに対しても、全く異なる文字表現をすると思われますが、問題の便宜上のため我々の0〜9には0〜9を、10はAで、11はBで数字を表すことにします。ちょっと練習問題をやってみませう。
例えば、十ニ進法で10と書かかれた数は、十進法では12と表現出来ますし、十ニ進法での100は十進法では12^2=144と計算出来ます。
もうちょいやってみると、十ニ進法で23Aと書かれた数は、十進法では(2×12^2)+(3×12)+(10)=334と計算されます。
では十ニ進法で
例:2/111
※ 問題中に使用されている人名、地域名、会社名、組織名、製品名、イベントなどは架空のものであり、実際に存在するものを示すものではありません。
ヘキサ星人との遭遇への最新コメント
[93875] 捕捉
投稿者::若◆[4ef9ada] 投稿日時: 2010-06-07 05:28:19
log()の外側を +1 して floor するという方法もありますが、[93791] (無題)
log()の内側を +1 して、そのまま ceil するという方法もあります。
後者の方が(N進法において、あくまで整数を扱う限りにおいては) 扱いやすいかもしれませんね。
例:
1000 は十進法で何桁?
log_10(1000+1) = 3.000434...
故に ceil して 4桁
投稿者::若◆[4ef9ada] 投稿日時: 2010-06-06 02:15:52
logの値をceilしてはいけないのは単純な話です。[93764] ありがとうっす★゚+.ヽ(*。>Д<)o゚+.゚☆
例で示したように、1000 は十進法で4桁の数ですが、log_10(1000) は丁度 3 になってしまいます。表記した際の桁数を正確に示すためには、「対数が丁度 n」の場合は n+1 となる必要があります。
よって、「1を足してfloor」という計算が必要です。
誤差については、↓に示した私の方法では、上の 1 を足して floor するという部分を取り払って計算してしまっています。例えば、以下のような時には問題になります。
2^2 は2進法では3桁ですが 4進法では何桁?
3 * log(2) / log(4) = 1.5 ですが、1桁ではいけない。答は2桁です。
ただし、少し考えてみましたが、2進から12進への変換で、2^n丁度という数については、これが問題になることは無さそうですね。
(2^n (n>1) が 12^m (m は整数) になることは無いですから)
投稿者::kikki◆[4d5b6fa] 投稿日時: 2010-06-05 21:15:10
561桁なのは自分の計算と一緒なんすけど、誤差の検証や「logの値をceilするのではなく、実数での植木算的に1を足してfloorする」の部分がイマイチ良く解ってなかったりする。…orz[93723] kikkiさんのコメント出題を勝手に整理
底が12の対数取って、携帯の電卓で=560、713…。と出てきたので561桁!とやったkikki氏でした(´∀`)。もうちょっと読んでみます…。
投稿者::若◆[4ef9ada] 投稿日時: 2010-06-05 16:11:43
kikkiさんによるコメントでの発展出題2題:[93722] 基数表記での桁数とは
(1) 十二進法 0.ABABABABAB… を十進法の既約分数で表わせ。
(2) 2^2010 (十進) を、十二進法で表示すると何桁の数になるか?
ただし、底を10としてlog2=0.301, log3=0.477 と近似して計算せよ。
この下には私の解答例が書いてあります。
投稿者::若◆[4ef9ada] 投稿日時: 2010-06-05 16:10:48
N進表記をした場合の整数Mの桁数とは:
int(log(M) / log(N) + 1)
ただしここで
log(x): x の自然対数
(上の式の中だけならば自然対数でなくとも、底は何でもいい)
int(x): x を越えない最大の整数
(floor function、あるいはガウス記号とも)
例えば、999、1000 はそれぞれ 10進表記で:
int(log(999) / log(10) + 1) = int(3.99..) = 3 桁
int(log(1000) / log(10) + 1) = int(4) = 4 桁
2^10=1024、2^10-1=1023 はそれぞれ、2進表記で:
int(log(1023) / log(2) + 1) = int(10.99..) = 10 桁
int(log(1024) / log(2) + 1) = int(11) = 11 桁
(境界領域での正確な桁数を出すには、logの値をceilするのではなく、
実数での植木算的に、1を足してfloorするのがポイント)
ヘキサ星人との遭遇の情報
問題作成日:2010-05-30
解答公開日:2010-05-30最終更新日:2011-03-24 21:39:46(更新回数:19)
更新内容:
正解率:31% (正解回数:33 解答回数:105)
kikkiさんの他の問題を見る