已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
8小时前关门了。
Improve this question
我有一个面试练习题,我需要创建一个幂函数(不使用pow()或**),它可以查找所有边缘情况(指数〈0||exponent == 0)。另外,我被告知只能使用一个if语句和一个循环。我已经解决了这个问题,但由于边缘情况,我无法找到一种方法,只使用一个循环,一个if。有什么想法?
#include <stdio.h>
float power(int base, int exponent){
if(exponent == 0) return 1;
float result = 1;
int i;
if(exponent > 0){
for(i = 0;i < exponent; i++){
result *= base;
}
} else {
for (i = 0; i > exponent; i--){
result *= base;
}
result = 1 / result;
}
return result;
}
int main()
{
int x = 2, y = -8;
float result = power(x,y);
printf("%.3f\n", result);
return 0;
}
2条答案
按热度按时间tkclm6bt1#
如果允许使用帮助函数,您可以执行以下操作:
顺便说一句:为了获得更好的精度,我建议使用
double
而不是float
如果没有辅助函数,请考虑如下代码:
(同样:首选
double
,而不是float
)iih3973s2#
我有一个面试练习题。......有什么想法?
记住目标是展示你在有一定限制的情况下编写C语言的能力和知识深度。代码应该:
使用exponentiation by squaring。
当指数很大时,像
for(i = 0;i < exponent; i++){
这样的迭代循环太慢了。正是这样的洞察力帮助区分了新手和有经验的程序员。
避免
-exponent
,因为当exponent == INT_MIN
时,这是UB。再一次,经验/洞察力的另一个标志。
使用
double
,因为float
在从大多数int
转换时会立即丢失精度。更多的洞察力。
包括测试线束。
有经验的程序员证明他们的代码是合理的,并提供评估方法。
小值范围下降到约4.94e-324,这比1.0/(最大值约为1.78e +308)小得多,因此将负幂分解为两步是明智的。