我想在python(3.6.5)中做一个程序来告诉例如1/7。对于这个例子,输出应该是这样的:“长度:6,重复数字:142857”。我到目前为止得到了这个:
n = int(input("numerator: "))
d = int(input("denominator: "))
def t(n, d):
x = n * 9
z = x
k = 1
while z % d:
z = z * 10 + x
k += 1
print ("length:", k)
print ("repeated numbers:", t)
return k, z / d
t(n, d)
做print ("repeated numbers:", t)
打印t
函数本身的表示,而不是它的输出。
这是修复后的代码版本。我使用Python 3.6+ f-string将重复数字转换为字符串,并在前面添加零以使其成为正确的长度。
def find_period(n, d):
z = x = n * 9
k = 1
while z % d:
z = z * 10 + x
k += 1
digits = f"{z // d:0{k}}"
return k, digits
# Test
num, den = 1, 7
period, digits = find_period(num, den)
print('num:', num, 'den:', den, 'period:', period, 'digits:', digits)
num, den = 1, 17
period, digits = find_period(num, den)
print('num:', num, 'den:', den, 'period:', period, 'digits:', digits)
产量
num: 1 den: 7 period: 6 digits: 142857
num: 1 den: 17 period: 16 digits: 0588235294117647
这条线可能有点神秘:
f"{z // d:0{k}}"
它说:找到小于或等于z
除以d
的最大整数,将其转换为字符串,并在左边用零填充(如果需要),使其长度为k
。
正如Goyo在评论中指出的那样,这种算法并不完美。如果小数包含任何非重复部分,也就是说,如果分母具有2或5的任何因子,它会陷入循环。看看你是否能找到解决这个问题的方法。