晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法、乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根。因为一个有理数开根之后可能得到一个无理数,所以这项工作是有较大难度的。现在要做的只是这项工作的第一步:只对自然数进行开整数次根,求出它的一个非负根,并且不考虑结果的小数部分,只要求把结果截断取整即可。程序需要根据给定的输入,包括需要开根的次数,以及被开根的整数;计算出它的非负根取整后的结果。
链接
BZOJ1213
题解
Python / Java 高精度 + 裸的牛顿法(二分也能卡过)
牛顿法 + Python 目前bzoj rank1
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| m, n = int(input()), int(input())
if n == 0: print 0 sys.exit() tmpn, len = n, 0
while tmpn > 0: tmpn /= 10 len += 1
base, digit, cur = 300, len / m, len % m
while (cur + m <= base) and (digit > 0): cur += m digit -= 1
div = 10 ** (digit * m)
tmpn = n / div
x = int(float(tmpn) ** (1.0 / m))
x *= (10 ** digit)
while True: x0 = x x = x + x * (n - x ** m) / (n * m) if x == x0: break
while (x + 1) ** m <= n: x = x + 1 print x
|