我正在经历一个编程课程,并被问到这个棘手的问题,直到课程结束才得到答案。
问题:
如何将任何输入(Float,int等)乘以7,
without using the
*
运营商
在TWO steps
。
如果有人能够通过解释给我这个问题的答案,那将非常有帮助。
有两个步骤我的意思是假设你正在运行一个循环(i = 0; i <7; i ++)in 那个案例的步数将是&gt; 2,也是TYPE CONVERSION, DIVISION,ADDITION等(计算步骤)。
答案 0 :(得分:34)
假设范围中定义了float x
或double x
。然后我看到以下几种可能性,在不使用*
运算符的情况下将其乘以7:
在C ++中,您可以使用标准仿函数(第一步:创建仿函数,第二步:调用仿函数):
x = std::multiplies<float>()(x, 7.0f); // if x is a float
x = std::multiplies<double>()(x, 7.0); // if x is a double
或者只使用除法(因为编译器已经评估1.0 / 7.0
,这只是一步):
x = x / (1.0f / 7.0f); // if x is a float
x = x / (1.0 / 7.0); // if x is a double
或者使用*=
运算符(从技术上讲,它不是*
运算符,但它只是一步):
x *= 7.0f; // if x is a float
x *= 7.0; // if x is a double
或者以对数标度使用加法(这不是非常严重,并且这需要两个以上的“步骤”):
x = exp(log(x) + log(7.0));
另一个选择是使用汇编指令,但我现在不想写,因为它过于复杂。
如果x
是整数,则位移是另一种选择,但不推荐:
x = (x << 3) - x; // (x * 8) - x
答案 1 :(得分:17)
你可以简单地使用除以第七的除法:
x / (1.0 / 7)
这是否算作“两步”完全取决于你的定义。
答案 2 :(得分:7)
添加
//initialise s as the number to be multiplied
sum=0
for(i=0;i<7;i++)
sum+=s
答案 3 :(得分:4)
在C中,以下hack应该适用于IEEE single precision floating point format中存储的浮点数:
#include <stdint.h>
float mul7 (float x) {
union {
float f;
uint32_t i;
} u;
u.f = x;
u.i += (3 << 23); /* increment exponent by 3 <=> multiply by 8 */
return u.f - x; /* 8*x - x == 7*x */
}
这是两个步骤(一个整数加法,一个浮点减法),排序,取决于你算作一个步骤。鉴于C ++或多或少与C向后兼容,我相信也应该有类似的技巧。
但是,请注意,此hack通常不会为subnormal,无限或NaN输入提供正确的结果,也不会为幅度过大的输入提供正确的结果,将它们乘以8会溢出。
调整代码以使用双精度而不是浮点数留给读者练习。 (提示:幻数是52。)
答案 4 :(得分:1)
您也可以对整数执行以下操作:
( x<< 3) - x
答案 5 :(得分:0)
定义“两步”......
float result = 0.0f;
float input = 3.14f;
int times = 7;
// steps
while (times--)
result += input;
修改:除以(1/7)将无法使用int
类型。另外在某些语言中它可以使用浮点类型,你必须将它们标记为浮点数:
result = input / (1.0f / 7.0f);
答案 6 :(得分:0)
// String num = "10";
// int num = 10;
float num = 10;
BigDecimal bigD = new BigDecimal(num);
BigDecimal seven = new BigDecimal(7);
System.out.println(seven.multiply(bigD));
您可以使用BigDecimal
&amp;它的multiply
方法。几乎适用于所有事情。
答案 7 :(得分:-3)
添加7次x次。
for(int i=0; i<10; i++)
result = result+7;