大早上起来……做题折磨自己~下午还有quiz……T_T
好,这道题是要求d<1000, 1/d的最长循环节,我上来想了一下,就直接试了试最大的素数997, 显然不对了……
然后想啊想,就是想不出来……就百度了一下最长循环节……竟然出来了这道题的讨论……这不科学……
不过里面推荐了
有关循环小数的趣味数学题
好东西啊!我看到里面最让我感动的两句话
一是关于分母中含有2,5这两个因子,那么小数要么不是循环小数(只含2,5),要么就是混合无限循环小数(2,5和其他素数混合)
二是数字p的循环节长度,要么是p-1,要么是(p-1)的因数
前一个是很对的,很靠谱,很有用。运算的时候就可以先把2,5两个因子剔除掉,只算不含2,5的(因为只要求最长循环节嘛!)。
后一个就不是很靠谱……有的时候是÷6,有的时候÷4,÷3,÷2,都不一定……让我非常捉鸡……
总之,看到答案是983,我们就来试试
一下全是不合理的推测……
首先猜测肯定是素数!
其次肯定偏大,那就从1000往下找。
997已经被排除……(我的猜测是997-1 = 996 996÷2 ÷ 3 都能除尽,不符合最优(虽然我也不知道什么事最优)的……)
991这玩意减一后990,感觉更不靠谱……
987(这个不是个素数……不管它了)
983,减一,982÷2 = 491,乍一看不能被2除,不能被3除,不能被5除……嗯……就是答案吧……
不过可不能就这么蒙混过关……
写个代码看看……
对了,这里有之前写的为了找规律的代码
for i in range(1, 30):
print('{} {:.22f}\n'.format(i, 1.0/i))
显然我又图样了,因为python的float类型……后面精度相当不够的!很多都看不出循环节~
后来我真写了个代码(抄的),来验证自己的stupid……
def calc(n):
for i in range(1, n):
if 10**i%n == 1:
return i
for i in range(1001, 900, -1):
if (i%5 != 0) and (i%2 != 0):
print(i, ",", calc(i))
这个想法挺对的!就是10**i 如果除以 n 余数是 1,那么就说明这个是个循环节了!
哎……我怎么就想不到呢……一直在考虑如何算长短……其实主要在想数学方法……
然后上面这个代码验证了我多图样……我就不说了。
修改一下可以直接出结果,比如加个list,加个max……