不使用乘法或除法运算符。 您只能使用加/减运算符。
答案 0 :(得分:9)
一个毫无意义的问题,但可以用对数的属性来解决:
pow(a,b) = exp( b * log(a) )
= exp( exp(log(b) + log(log(a)) )
注意确保指数函数和对数函数使用相同的基数。
是的,我知道如何使用幻灯片。学习这个技巧会改变你对数的观点。
答案 1 :(得分:4)
如果它们是整数,则很容易将pow(a,b)转换为b的乘法。
pow(a, b) = a * a * a * a ... ; // do this b times
简单地将a *变为附加
a * a = a + a + a + a + ... ; // do this a times
如果你把它们组合起来,就可以制作动力。
首先,制作mult(int a,int b),然后用它来制作pow。
答案 2 :(得分:2)
递归解决方案:
#include<stdio.h>
int multiplication(int a1, int b1)
{
if(b1)
return (a1 + multiplication(a1, b1-1));
else
return 0;
}
int pow(int a, int b)
{
if(b)
return multiplication(a, pow(a, b-1));
else
return 1;
}
int main()
{
printf("\n %d", pow(5, 4));
}
答案 3 :(得分:0)
你已经得到纯粹的FP和纯粹的整数答案。这是一个FP数字提升到整数幂:
double power(double x, int y) {
double z = 1.0;
while (y > 0) {
while (!(y&1)) {
y >>= 2;
x *= x;
}
--y;
z = x * z;
}
return z;
}
目前这使用乘法。您可以仅使用位移,几位比较和加法来实现乘法。对于整数,它看起来像这样:
int mul(int x, int y) {
int result = 0;
while (y) {
if (y&1)
result += x;
x <<= 1;
y >>= 1;
}
return result;
}
浮点几乎是相同的,除了你必须标准化你的结果 - 即,实质上,浮点数是1)有效数字表示为(通常相当大)整数,2)比例因子。如果你想产生正常的IEEE浮点数,那么有些部分会变得有点丑陋 - 例如,比例因子被存储为“偏置”数而不是通常的1的补码,2的补码等等,所以使用它是笨拙的(基本上,每次操作都会减去偏差,执行操作,检查溢出,并且(假设它没有溢出)再次添加偏差)。
在没有任何逻辑测试的情况下完成这项工作听起来(对我来说)可能不是真的有意。对于相当多的计算机体系结构类,将问题简化为可以直接在硬件中表达的基本操作(例如,位移,按位 - AND
, - OR
和 - NOT
是很有趣的。等等。上面显示的实现非常合适(如果你想获得技术,加法器需要几个门,但VHDL,Verilog等,但它包含在VHDL和Verilog之类的东西中)。