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
- nyoj 773 开方数【快速幂】
- nyoj-773-开方数
- NYOJ 773 开方数
- nyoj 773 开方数
- NYOJ 773 开方数
- NYOJ 773 开方数【数学题】
- NYOJ 773 开方数(java)
- A/B Problem && 开方数(nyoj 803 && 773)
- 南阳 773 开方数
- 快速开方
- 快速开方
- 开方数
- 开方数
- 开方数
- 开方数
- nyist 773 开方数(大数问题)
- 快速浮点开方运算
- 大数快速开方
- 阿里笔试——跳格子问题
- 是时候抛弃 Eclipse 转向 IntelliJ IDEA了
- 详解coredump
- 欢迎使用CSDN-markdown编辑器
- 添加自定义的protocol时出错:
- nyoj 773 开方数【快速幂】
- matlab一些小技巧
- 网页网站那点事儿
- 分享四
- LVS 单独完成--负载均衡
- HDU 1072 Nightmare(BFS)(注:不标记每个节点四方向累计4次剪枝)
- C语言中的输入输出函数详解与比较scanf,sscanf,printf,sprintf,fprintf
- Windows下主要进程的启动顺序
- Spring MVC全局异常后返回JSON异常数据