listOfLongDeci = [showFFloat Nothing (1/a) | a<-[2..1000], length (show (1/a)) > 7]
listOfLongDeci2 = [show (1/a) | a<-[2..1000], length (show (1/a)) > 7]
listOfLongDeci3 = [(1/a) | a<-[2..1000], length (show (1/a)) > 7]
如何使用其中任何一个来创建非科学记数法的字符串列表? (Euler 26)
答案 0 :(得分:2)
第一个提供了
ShowS
的列表,如何从String
创建ShowS
?
由于ShowS
是String -> String
的类型同义词,因此您可以通过将该函数应用于String
来获得String
。由于showXFloat
函数会生成一个函数,该函数会将一些String
添加到最终String
参数(基本上是一个差异列表;许多show
- 相关的函数会产生这样的函数 - {{1} },shows
,showChar
,仅举几例 - for reasons of efficiency),最终参数的自然选择是空showString
,所以
String
以非科学记数法生成listOfLongDeci = [showFFloat Nothing (1/a) "" | a<-[2..1000], length (show (1/a)) > 7]
s的列表,正确舍入到数字String
的十进制表示的近似值。
如何使用其中任何一个来创建非科学记数法的字符串列表? (euler 26)
第一部分已经回答,但这些陈述无法帮助您解决Project Euler的Problem 26,
查找
1/a
的值,其d < 1000
包含小数部分中最长的重复周期。
A 1/d
具有53位精度(有效数为52个显式位,加上归一化数字的一个隐藏位,没有隐藏位,因此对于次正规数,精度为52或更少),数字为{{除非Double
是2的幂,否则1}}无法准确表示为1/d
。53位精度为您提供粗略
Double
精确度的有效十进制数字,因此从第一个非零数字开始,您可以获得15或16位数,这些数字对于分数d
的精确[终止或重复]十进制扩展是正确的,超出那个,扩张不同。
例如,Prelude> 53 * log 2 / log 10
15.954589770191001
具有长度为35的重复周期1/d
(到目前为止不是要考虑的范围中最长的周期)。最接近可表示的1/71
到01408450704225352112676056338028169
是
Double
其中前17个有效数字是正确的(1/71
也是0.01408450704225352144438598855913369334302842617034912109375 = 8119165525400331 / (2^59)
给你的。)
要在0.014084507042253521
的十进制扩展中找到最长的循环周期,您可以使用showFFloat Nothing (1/71) ""
数字1/d
的精确(或足够精确的有限)字符串表示,或者更好,使用纯整数运算(使用长除法计算十进制扩展),而不涉及Rational
。