使用数组精确计算M/N(0<M<N≤100)的值。假如M/N是无限循环小数,则计算并输出它的第一循环节,同时要求输出循环节的起止位置(小数位的序号)。
由于计算机字长的限制,常规的浮点运算都有精度限制,为了得到高精度的计算结果,就必须自行设计实现方法。
为了实现高精度的计算,可将商存放在一维数组中,数组中的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中,以此类推。这样就可以使用数组来表示一个高精度的计算结果。
下面直接上代码:
########################
if __name__ == "__main__":
ys = [0]*101 # ys存放除法的余数
shang = [0]*101 # shang 依次存放商的每一位
print("请输入分子与分母大于0,小于等于100的分数")
m = int(input("分子m = ")) # 分子
n = int(input("分母n = ")) # 分母
print("输入的分数为:%d/%d" %(m, n))
print("%d/%d 的准确值是:0." %(m, n), end="")
for i in range(1, 101): # i商的位数
ys[m] = i # m:得到的余数;ys[m]:该余数对应的商的位数
m *= 10 # 余数扩大10倍
shang[i] = m // n # 商
m = m % n # 求余数
if m == 0: # 余数为0则表示是有限小数
j = 1
while j <= i:
print("%d" %shang[j], end="") # 输出商
j += 1
break # 退出循环
if ys[m] != 0: # 若该余数对应的位在前面已经出现过
j = 1
while j <= i:
print("%d" %shang[j], end="") # 输出循环小数
j += 1
print("\n分数的第一个循环节:%d" %ys[m])
print("循环节的起始位置为:%d" %i)
break
########################
执行结果:
请输入分子与分母大于0,小于等于100的分数
分子m = 1
分母n = 3
输入的分数为:1/3
1/3 的准确值是:0.3
-----
请输入分子与分母大于0,小于等于100的分数
分子m = 22
分母n = 79
输入的分数为:22/79
22/79 的准确值是:0.2784810126582
分数的第一个循环节:1
循环节的起始位置为:13
________________END______________
网友评论