<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">刚开始想着直接用换底公式:log</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 10px; background-color: rgb(255, 255, 255);">a</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">b=(lg b)/(lg a) <span style="font-family:宋体;">做,后来看到数据范围是</span>1<=n<= 200, 1<=p<10^101的时候感觉可能是要用大数了。想了一下有没有可以优化的方法,没有思路,就查了解题报告....(T_T,手贱,总是改不了这个毛病),发现double类型可以存的下10^101次方,整个代码不过几行....好吧还是基础太渣。</span>
类型 长度 (bit) 有效数字 绝对值范围
float 32 6~7 10^(-37) ~ 10^38
double 64 15~16 10^(-307) ~10^308
long double 128 18~19 10^(-4931) ~ 10 ^ 4932
省赛的时候也曾经因为精度问题起过分歧,吸取经验教训,以后不再犯这样的错误了。
超简洁的代码:
#include<stdio.h>
int main()
{
double p, n;
while(scanf("%lf%lf",&n,&p)!=EOF)
printf("%.0lf\n",pow(p,1/n));
return 0;
}
#include<stdio.h>
#include <math.h>
int main()
{
double p, n;
while(scanf("%lf%lf",&n,&p)!=EOF)
{
long long r, l, m;
double t;
l=0;r=1000000002;
while(l<=r)
{
m=(l+r)/2;
t=pow(m, n);
if(t==p)
{
printf("%lld\n",m);
break;
}
else
{
if(t>p) r=m;
else l=m+1;
}
}
}
return 0;
}
T_T以后再随便搜解题报告就剁手