「HNOI2004」「BZOJ1213」高精度开根-高精度+牛顿法

晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法、乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开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
#

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×