Run Code Online (Sandbox Code Playgroud)#include<stdio.h> #include<math.h> int main() { double n,p,ans; while(scanf("%lf %lf",&n,&p)==2) { ans=pow(p,(1/n)); printf("%.0lf\n",ans); } return 0; }
这里用什么算法来查找ans.这个pow()函数的复杂性是什么?
小智 6
C99标准的4.12.7.4节中没有更多关于pow功能的说法,而不是以下内容:
新思
Run Code Online (Sandbox Code Playgroud)#include <math.h> double pow(double x, double y); float powf(float x, float y); long double powl(long double x, long double y);描述
该
pow函数计算x幂y.如果x是有限和负的并且y是有限的而不是整数值,则会发生域错误.可能会出现范围错误.如果x为零且为零,y则可能发生域错误.如果x为零且y小于零,则可能发生域错误或范围错误.返回
该
pow函数返回[x幂y.
注意,没有给出关于函数复杂性的信息,并且没有关于要使用的算法的期望.这是因为在C的一些实现中,函数可以是处理器的原生函数,而在其他体系结构上,硬件不提供浮点处理.
但是,您可以假设复杂性并不比log乘法和exp组合的复杂性差:
double pow(double x, double y) {
return exp(log(x)*y);
}
Run Code Online (Sandbox Code Playgroud)
在FP单元的许多平台上,base-e取幂,浮点乘法和自然对数都需要O(1)时间,因此也pow应如此.
-edit2-我不那么肯定了对复杂的exp和log,但我觉得实现使用泰勒近似和一堆查找表.那仍然会给O(1).
| 归档时间: |
|
| 查看次数: |
3629 次 |
| 最近记录: |