题解 P2293 【[HNOI2004]高精度开根】

· · 题解

Python党福利

作为一个C++爱好者,我最讨厌高精度的题,每次都要写很长一段代码

所以不得不

高精背公式。

但Python就不一样了(我们Python自带高精!!!)

所以说用Python做高精度加法,就和用C++做A+B problem一样简单

这道题也是一样,我选择了Python

前言

本人以前从没接触过Python,便花10分钟自学了一下

比如说这个网站讲得很好,初学者及不会Python者可以看看

思路

好,我们回归正题。

在讲思路前,我先给大家科普一下这道题要用的东西(C++篇,Python dalao直接跳过)

input()&print()----------相当于cin&cout

a**b---------------------相当于pow(a,b)

要点就这么多.

这里还要说明一下,如果是a**(1/b)(b是整数),那么就是表示a的b次根

那题目中要求a的b次根,岂不是很简单?

于是我敲出了以下代码:

m=input()
n=input()
m=int(m)
n=int(n)
n=n**(1/m)
print(int(n))

结果是AC÷2,50分,5个点RE惹...

于是走投无路间,我去看了看题解

看了看这位巨佬滴题解后,才发现要用二分答案!

AC$ $Code:
m=input() # 这个部分也可以写成:
n=input() # m=int(input())
m=int(m)  # n=int(input())
n=int(n)  #

l=0 #既然用二分,那就必须要有左右指针的1啦
r=1 #注:Python里如果一个变量已赋值,那么就不需定义(有别于C++)

while(1):              #在Python里,
    if(r**m>n):break   #while,if else语句后都用:而不是{},且里面的语句都要缩进
    l=r;r*=2 #这里是类似C++的用法 
while(l+1<r): 
    mid=(l+r)//2
    if (mid**m<=n):l=mid
    else:r=mid

if (l**m<=n):print(l)
else:print(r)

如果你学过C++,你就可以尝试学学Python,如果你学过Python,你也同样可以尝试学学C++

C++和Python也有异曲同工之妙.

点个赞再走?