srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

yukicoder No.428 小数から逃げる夢

問題

問題概要

0.(190桁)のような少数が与えらえる。これをn倍した値を求める。

解法

小数点以下が多くある状態で扱ってるとまずいので、全体を整数で扱うことにした。Dを整数としてあつかい、それに与えられたnをかける。あとは、これをDを整数にするためにかけた分だけ割ればいいが、普通に数字のまま割ってしまうと、また小数点以下が多く出てしまい、意味がなくなってしまう。そこで、文字列としてあつかい、どこに小数点をつけるべきかを考えればよい。今回の問題では、nが100までなので、どこで、桁が繰り上がるのかを計算しておいてそれによって3つに場合分けして、それぞれで小数点の位置を変えればいい。

ミス

pythonはこういう問題で便利だね。整数にすれば、大きい値も普通に使えるから。こういう時しか使わないから、いろいろ忘れてて実装するのに手間取った。
多倍長と普通の整数の掛け算なので、c++で書くにしても配列にいれて、やるだけで終わるらしい。

コード

n = int(raw_input())
d = 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991
ans = d * n
s = str(ans)

if n <= 8:
    ss = "0." + s
    print ss
elif 9 <= n and n <= 81:
    ss = s[0] + '.'
    for i in range(1,len(s)):
        ss += s[i]
    print ss
else:
    ss = s[0] + s[1] + '.'
    for i in range(2,len(s)):
        ss += s[i]
    print ss