文章目录
- 题目描述
- 输入
- 输出
- 样例
- 知识点
- 解析
题目描述
编写程序实现将任意10进制正小数m转换成n进制的正小数,小数点后保留10位小数。
输入
输入包含两个数m,n,用空格隔开。输入包含多组测试,当m,n都为0时输入结束。
Limits:
0.0000009<m<1
1<n<10
输出
输出10进制正小数m的n进制小数。结果保留10位小数。
样例
输入样例 1
0.795 3
0 0
输出样例 1
0.2101101122
先上代码:
import math
def func():
def trans(num, specified_format) -> str:
result = ''
integer = math.floor(num)
decimal = num - integer
while integer >= specified_format:
remainder = integer % specified_format
integer /= specified_format
result = str(remainder) + result
result += str(integer)
result += '.'
counter = 0
while counter < 10:
decimal *= specified_format
result += '{:.10f}'.format(decimal).split('.')[0]
decimal -= math.floor(decimal)
counter += 1
return result
while True:
m, n = map(float, input().strip().split())
if m == 0 and n == 0:
break
print(trans(m, n))
if __name__ == '__main__':
func()
知识点
- 整数部分和小数部分的进制转换
- 取消默认使用的使用科学记数法
解析
- 小数的进制转换要分成整数部分和小数部分分别进行。整数部分很简单,就是对目标进制数取模得到余数添加到结果中,然后再除。而小数部分就要乘目标进制数,将整数部分添加到结果中,再对剩余的小数部分重复进行此操作,直到得到0或达到目标精度。
- 做题时遇到的问题是,如果decimal值比较小,如0.000001,那么就会被表示为1e-6,而不是纯数字。这个问题可以通过format解决。’{:.xf}’.format(num),就可以用纯数字表示。