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

 [蓝桥杯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、代码及解析

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


p,q = map(int,input().split())
S = int(input())

def gcd(a,b):
    if a % b == 0:
        return b
    else:
        return gcd(b,a%b)

#处理那种开头有不是循环的数
#例如0.166666可以分解为 0.1 +0.0666//999*10
#同理0,116666可以分解为 0,11+0.00666//999*10**2
if p !=1 :
    #处理不是循环部分
    a = int(str(S)[:p-1])
    b = 10**(len(str(a)))
    max_ab = gcd(a,b)
    a = a//max_ab
    b = b//max_ab

    # 处理循环部分
    c = int(str(S)[p - 1:])
    d = (10 ** (len(str(c))) - 1)*10**(p-1)
    max_cd = gcd(c, d)
    c = c // max_cd
    d = d // max_cd

    e = a*d + c*b
    f = b*d
    max_ef = gcd(e,f)
    e = e//max_ef
    f = f//max_ef
    print(e,f)
else:
    #处理循环部分
    c = int(str(S)[p-1:])
    d = 10**(len(str(c)))-1
    max_cd = gcd(c,d)
    c = c//max_cd
    d = d//max_cd
    print(c,d)

结果:

 


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

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


猜你喜欢

转载自blog.csdn.net/Callme_TeacherPi/article/details/124040406