题解 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惹...
于是走投无路间,我去看了看题解
看了看这位巨佬滴题解后,才发现要用二分答案!
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也有异曲同工之妙.
点个赞再走?