nyoj 773 开方数【快速幂】

来源:互联网 发布:量化投资 算法 编辑:程序博客网 时间:2024/05/16 13:06

开方数

时间限制:500 ms  |  内存限制:65535 KB
难度:3
描述
现在给你两个数 n 和 p ,让你求出 p 的开 n 次方。
输入
每组数据包含两个数n和p。当n和p都为0时表示输入结束。(1<=n<=200,1<=p<=10^101)
输出
对于每个输出对用输出开方后的结果k(结果小于10^9)。
样例输入
2 163 277 43571861840213822045440 0
样例输出
431234


这个题,不得不说点感想......


第一眼看到这个题,不知道怎么处理,感觉是大数问题,而且是开方的,更难处理了,然而......突然发现,结果比较小,就直接用函数试一试,结果过了........


 #include<stdio.h>#include<math.h>int main(){double n,p;while(scanf("%lf%lf",&n,&p),n||p){printf("%.0lf\n",pow(p,1.0/n));//直接调用...}return 0;}        


.虽然过了,但是心里不踏实,就想办法用二分做做吧,然后自己构造了一个二分求幂的函数来计算幂结果,然而...一直超时....


 #include<stdio.h>double pow(double x,int m)//二分求幂{double s=1.0;while(m){if(m&1){s*=x;}x*=x;m>>=1;}return s;}int main(){double p;int n;while(scanf("%d%lf",&n,&p),n||p){int l=0,r=1e9,mid;while(1){mid=(l+r)>>1;double tp=pow((double)mid,n);if(tp>p){r=mid-1;}else if(tp<p){l=mid+1;}else{break;}}printf("%d\n",mid);}return 0;}        

二分的时间复杂度是 logn 已经很快了,但是竟然一直超时.......后来看到用pow 函数+二分,可以过,然后自己也调用pow,过了...


#include<stdio.h>#include<math.h>int main(){double p;int n;while(scanf("%d%lf",&n,&p),n||p){int l=0,r=1e9,mid;while(1){mid=(l+r)>>1;//二分double tp=pow(mid,n);if(tp>p){r=mid-1;}else if(tp<p){l=mid+1;}else{break;}}printf("%d\n",mid);}return 0;} 


然后很好奇,还有什么方法求幂比二分的方法还快??(本人菜鸟,大神勿喷)

然后上网搜 pow 函数的实现方法,然而....级数展开,数列收敛,泰勒公式,各种名词,各种知识点,怪自己数学没学好,这些都没学会......


唉......由感而发,编程的水深着呢,以后还是好好学习吧,各种算法牵扯的各种知识太多了,任何时候都不能说自己学会了什么,没见过的多了去了!!




2 0
原创粉丝点击