shuto_log.aep

ブログ名変わりました。自分がやったことなどを備忘録的な感じで残していこうと思います。

やたら桁数の大きい計算が必要なとき

ctfとかでたまに必要なときがあるのですが、その度に調べるの面倒くさいのでメモ。

よく使うのはbcコマンドです。

Linuxコマンド集 - 【 bc 】 数値計算を行う:ITpro
とか
webkaru.net
とか。



使い方は上記の通りだけど、計算させたい内容を引数で渡せないのでちょっと気持ち悪い。

$ echo "8*3^41" | bc

ってやると標準出力で答えが返ってくる。で、たいていはその値をテキストファイルとかに出力したいので

$ echo "8*3^41" | bc > ans.txt

とかってやるんだけど、桁数が異様に長いときは変な改行が入る。

$ echo "8*3^1000" | bc

10576566555846453095123642078017154927723376262017185341319362945814\
62877877363919632622651080486449571127822157498065884760763665680495\
12949227418020636293922209618015865664310241181938317187301951232009\
40708944329031582524984755504492529384432693395924049425003842755244\
37643517631116653972294603932908976664214851022865832182733118646310\
31753484512326791915008749859373747708795095641341201515247048724834\
08717371510912822514803085189977326656084914929057384822151222841760\
008

なのでこのままテキストに落としても使えないので「\」と改行を取り除いてから出力する。

$ echo "8*3^1000" | bc | tr -d "\\\n" > ans.txt

trコマンドは文字列の置換をしてくれる。-dオプションで特定文字列の削除が行える。
「\」はエスケープさせないといけないので上記の場合、"\\\n"の最初の2つの\\で「\」を表し、後ろの\nで改行を表してる。

trコマンドについては

などを参照。
こうするとans.txtに改行を含まない1行の計算結果が出力される。