Island Life

< パスポートと免許更新 | 創作活動って自分を晒け出さねばならないところがある... >

2019/06/20

ループを使わずに1から100まで

「ループ、再帰、gotoを使わずに1から100までを印字するC++プログラムは書けますか?」へのIchi Kanayaさんの回答 で紹介されている Conner Davis 氏の解がおもしろい。

1000/(999^2)を計算すると、

0.001002003...099100101...

というふうに小数点数以下3桁ごとに001, 002, ..., 099, 100 が現れる。任意精度演算ライブラリを使ってそこで表示を打ちきれば題意を満たす。

Gaucheは多倍長整数演算は組み込みで持っているが、任意精度の小数を計算するライブラリはついてこない。ただ、有理数で計算してスケールすることはできる。

あと、formatにはn桁ごとにコンマを入れる機能がある (桁数および挿入文字は指定可能)。なのでこうするとまるで1つづつ計算してるかのように:

gosh> (format #t "~399,'0:d\n" (floor (* (/ 1000 (square 999)) #e1e300)))
001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,016,017,018,
019,020,021,022,023,024,025,026,027,028,029,030,031,032,033,034,035,036,
037,038,039,040,041,042,043,044,045,046,047,048,049,050,051,052,053,054,
055,056,057,058,059,060,061,062,063,064,065,066,067,068,069,070,071,072,
073,074,075,076,077,078,079,080,081,082,083,084,085,086,087,088,089,090,
091,092,093,094,095,096,097,098,099,100
#<undef>

(フォーマット指示子の399,'0のところは、冒頭に00を置くため。)

Tag: Gauche

Post a comment

Name: