[编程题]a/b
  • 热度指数:4585 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
求 a/b 的小数表现形式。如果 a 可以整除 b 则不需要小数点。如果是有限小数,则可以直接输出。如果是无限循环小数,则需要把小数循环的部分用"()"括起来。

数据范围:

输入描述:
两个整数a和b,其中

0 <= a <= 1000 000

1 <= b <= 10 000


输出描述:
一个字符串,该分数的小数表现形式
示例1

输入

10 1

输出

10

说明

10/1 = 10 
示例2

输入

1 2

输出

0.5

说明

1/2 = 0.5 
示例3

输入

1 3

输出

0.(3)

说明

1/3 = 0.333333... 
示例4

输入

1 6

输出

0.1(6)

说明

1/6 = 0.16666666.... 
示例5

输入

1 7

输出

0.(142857)

说明

1 / 7 = 0.1428571428... 
def solve(x,y):
    k=x//y;
    pre,back=str(k),"";
    cycle={}
    while x%y:
        x=(x%y)*10;
        if cycle.get(x)!=None:
            i=cycle[x]
            back=back[:i]+"("+back[i:]+")";
            break;
        else:
            p=x//y;
            back+=str(p);
            cycle[x]=len(back)-1;
    if back:
        return pre+"."+back;
    else:
        return pre
x,y=list(map(int,input().split()))
print(solve(x,y))

发表于 2020-03-08 11:28:04 回复(0)

Python 3 版本 

按照正常除法的思路来写循环,

每次把商和余数记录在L1,L2中 

当余数重复出现的时候,说明出现循环,

记下重复出现的余数在L2中的位置index 在L1中,第0个元素是小数点左侧的数,0~index+1是括号左侧的数,index+1~最后是括号内的数

import sys
a, b = map(int, sys.stdin.readline().strip().split())
if a % b == 0:
    print(a // b)
else:
    L1 = []
    L2 = []
    flag = False
    while a % b != 0:
        L1.append(str(a//b))
        yushu = a%b
        if yushu in L2:
            index = L2.index(yushu)
            flag = True
            print(str(L1[0])+'.'+''.join(L1[1:index+1])+'('+''.join(L1[index+1:])+')')
            break
        else:
            L2.append(yushu)
            a = yushu*10
    if flag == False:
        L1.append(str(a//b))
        print(str(L1[0])+'.'+''.join(L1[1:]))


编辑于 2020-02-17 22:33:11 回复(0)
a, b = map(int, input().split())
int_num = a // b 
left = a % b

ans_num = []
index_num = {}

i = 0
while left != 0 and left not in index_num:
    index_num[left] = i
    res_part = left * 10 // b
    ans_num.append(res_part)
    left = left * 10 % b
    i += 1

if len(ans_num) == 0:
    print(int_num)
elif left == 0:
    print(str(int_num)+".", end="")
    for mod_num in ans_num:
        print(str(mod_num), end="")
    print()
else:
    print(str(int_num)+ ".", end="")
    for j in range(index_num[left]):
        print(str(ans_num[j]), end="")
    print("(", end="")
    k = index_num[left]
    for num in ans_num[k:]:
        print(str(num), end="")
    print(")")

发表于 2019-08-26 16:20:27 回复(0)

我TM服了 本地输出的明明是正确结果,牛客网给我输出完括号位置就变了,真的无语,咋回事啊大家谁看看哪错了,用例101 9997

a,b = map(int,input().strip().split())
quot = a//b
mod = a%b
decimal = []
remains = {}
recur_len = 0
while True:
    # 如果当前余数已经出现过,循环节长度为
    # 上次出现当前余数的位置一直到当前余数的前一个位置
    if remains.get(mod,False):
        for i in range(len(remains)):
            if list(remains.keys())[i] == mod:
                recur_len = len(list(remains.keys())[i:])
                break
        break
    # 否则将当前余数添加至字典
    else:
        remains[mod] = True
    mod*=10
    # 记录最后一位小数,如果能除尽,跳出
    decimal.append(str(mod//b))
    if mod%b == 0:
        break
    mod %= b
# print(decimal,recur_len,remains)
if len(decimal)!=0 and not (decimal[0] == '0' and len(decimal)==1):
    if recur_len!=0:
        res = str(quot)+'.'+str(''.join(decimal[:-recur_len]))+'('+str(''.join(decimal[-recur_len:])+')')
    else:
        res = str(quot)+'.'+str(''.join(decimal))
else:
    res = str(quot)
print(res)
发表于 2019-08-13 14:46:33 回复(0)