当前位置:   article > 正文

[蓝桥杯python] 循环小数:已知S是一个小于1的循环小数,请计算与S相等的最简真分数是多少。例如0.333...等于1/3,0.16...等于1/6。_python已知 s 是一个小于 1 的纯循环小数,纯循环小数是从十分位开始循环的小数,如

python已知 s 是一个小于 1 的纯循环小数,纯循环小数是从十分位开始循环的小数,如

 [蓝桥杯python] 循环小数

1、资源限制

2、输入格式

3、输出格式

4、样式输入及输出

5、代码及解析

大功告成!编写不易,大家成功后点个关注or赞谢谢~


问题描述

  已知S是一个小于1的循环小数,请计算与S相等的最简真分数是多少。例如0.333...等于1/3,0.1666...等于1/6。


1、资源限制

资源限制

时间限制:1.0s   内存限制:256.0MB

2、输入格式

输入第一行包含两个整数p和q,表示S的循环节是小数点后第p位到第q位。第二行包含一个q位数,代表S的小数部分前q位。

3、输出格式

输出两个整数,用一个空格分隔,分别表示答案的分子和分母。

4、样式输入及输出

样例输入

1 6

142857

样例输出

1 7

5、代码及解析

具体解析请大家自己看一下代码中的备注,在此不多做解释。

  1. p,q = map(int,input().split())
  2. S = int(input())
  3. def gcd(a,b):
  4. if a % b == 0:
  5. return b
  6. else:
  7. return gcd(b,a%b)
  8. #处理那种开头有不是循环的数
  9. #例如0.166666可以分解为 0.1 +0.0666//999*10
  10. #同理0,116666可以分解为 0,11+0.00666//999*10**2
  11. if p !=1 :
  12. #处理不是循环部分
  13. a = int(str(S)[:p-1])
  14. b = 10**(len(str(a)))
  15. max_ab = gcd(a,b)
  16. a = a//max_ab
  17. b = b//max_ab
  18. # 处理循环部分
  19. c = int(str(S)[p - 1:])
  20. d = (10 ** (len(str(c))) - 1)*10**(p-1)
  21. max_cd = gcd(c, d)
  22. c = c // max_cd
  23. d = d // max_cd
  24. e = a*d + c*b
  25. f = b*d
  26. max_ef = gcd(e,f)
  27. e = e//max_ef
  28. f = f//max_ef
  29. print(e,f)
  30. else:
  31. #处理循环部分
  32. c = int(str(S)[p-1:])
  33. d = 10**(len(str(c)))-1
  34. max_cd = gcd(c,d)
  35. c = c//max_cd
  36. d = d//max_cd
  37. print(c,d)

结果:

 


 自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!

大功告成!编写不易,大家成功后点个关注or赞谢谢~~


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/195043
推荐阅读
相关标签
  

闽ICP备14008679号