Shopee笔试题:化简循环小数
输入:
0.3(333)
化简:
1/3
输入:
0.416(6)
化简:
5/12
我的解答(卡在了求公约数的时间复杂度上,正确率30%):
def find(n, m):
if n < m:
x = n
n = m
m = x
while m != 0:
y = n%m
n = m
m = y
return n
def simplify(num, den):
"""化简分数"""
for i in range(2, num):
while num%i == 0 and den%i == 0:
num = num // i
den = den // i
return num, den
def to_frac(a, b=None):
"""
:param a: 非循环部分
:param b: 循环部分
:return: 分数
"""
num = int(a) - int(a[:-len(b)])
den = '9'*len(b) + '0'*len(a[:-len(b)])
return simplify(int(num), int(den))
def read_data():
data = input()
idx = data.find('(')
a, b = None, 0
if idx != -1:
a = int(data[2:idx])
b = int(data[idx + 1:-1])
else:
a = int(data[2:]) * 10
a = str(a)
b = str(b)
while len(a) <= len(b):
a = a + b
return a, b
a, b = read_data()
print('{}/{}'.format(*to_frac(str(a), str(b))))
第二题二进制乘法,第三题比较神了:
已知一个序列编码,只有Y/N两种表现,Y表示传输数字X可以被该位的序号数字整除,例如:
4的序列编码为YYNY,则4可被1,2,4整除,无法被3整除。
已知有一个长度为L(L小于10^6)的编码序列,请问他有多少种表示方式?
示例输入:
4
示例输出:
6
解答:
YYYY YYNY YYNN YNNN YNYN YYYN
求大佬指点~

