0
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]
  • 第一个给出了 ShowS 的列表,我怎样才能从 showS 中创建一个字符串?
  • 第二个给出科学记数法列表
  • 第三只给出双打列表

如何使用其中任何一个来创建具有非科学记数法的字符串列表?(欧拉 26

4

1 回答 1

2

根据要求

第一个给出了一个列表,ShowS我该如何制作?StringShowS

由于ShowS是 的类型同义词String -> String,因此您可以String通过将函数应用于 a 来获得 a String。由于showXFloat函数产生一个函数,该函数String在最后一个String参数前面加上一些(基本上是一个差异列表;许多show相关函数产生这样的 - shows, showChar, showString, 仅举几例 -出于效率的原因),最后一个参数的自然选择是空的String, 所以

listOfLongDeci = [showFFloat Nothing (1/a) "" | a<-[2..1000], length (show (1/a)) > 7]

生成Strings 的列表,正确舍入到1/a非科学计数法中数字的十进制表示形式。

如何使用其中任何一个来创建具有非科学记数法的字符串列表?(欧拉 26)

第一部分已经回答了,但是这些表示并不能帮助你解决Project Euler 的问题 26

找出其小​​数部分中包含最长循环周期d < 1000的值。1/d

ADouble有 53 位精度(52 位显式有效位加上 1 个隐藏位用于归一化数字,没有隐藏位,因此次正规数的精度为 52 位或更少),并且该数字1/d不能精确表示为 aDouble除非d是幂2. 53 位的精度给你大致

Prelude> 53 * log 2 / log 10
15.954589770191001

精度的有效十进制数字,因此从第一个非零数字开始,您有 15 或 16 位数字,您可以期望对 fraction 的精确 [终止或重复] 十进制扩展是正确的1/d,除此之外,扩展不同。

例如,1/71有一个长度为 35 的循环周期01408450704225352112676056338028169(到目前为止不是要考虑的范围中最长的)。最接近的可表示Double1/71

0.01408450704225352144438598855913369334302842617034912109375 = 8119165525400331 / (2^59)

其中前 17 位有效数字是正确的(0.014084507042253521也是showFFloat Nothing (1/71) ""给你的)。

要在 的十进制扩展中找到最长的重复循环1/d,您可以使用数字的精确(或足够精确的有限)字符串表示Rational1 % d或者更好的是,使用纯整数算术(使用长除法计算十进制扩展)而不涉及Rational.

于 2013-05-24T09:02:03.217 回答