22

I was going through a programming class and was asked this tricky question which was left unanswered till the end of the class.

Question:

How can I multiply any input(Float,int etc) by 7, without using the * operator in TWO steps.

If anyone can give me the answer for this question with the explanation , that would be very helpful.

With TWO STEPS I mean suppose you are running a loop (i=0;i<7;i++) in that case number of steps will be >2, also TYPE CONVERSION, DIVISION,ADDITION etc ( Counts for steps ).

4

8 回答 8

35

假设float xdouble 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
于 2013-04-22T10:59:22.210 回答
17

您可以简单地使用除以七分之一:

x / (1.0 / 7)

这是否算作“两步”完全取决于您的定义。

于 2013-04-22T10:58:02.797 回答
7

添加它

//initialise s as the number to be multiplied
 sum=0
for(i=0;i<7;i++)
    sum+=s
于 2013-04-22T10:58:42.343 回答
4

在 C 中,以下 hack 应该适用于以IEEE 单精度浮点格式存储的浮点数:

#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、infinite 或 NaN 输入给出正确的结果,也不会为幅度如此之大以至于将它们乘以 8 会溢出的输入给出正确的结果。

将代码调整为使用双精度数而不是浮点数作为练习留给读者。(提示:幻数是 52。)

于 2013-04-22T20:15:10.413 回答
1

您还可以对整数执行以下操作:

( x<< 3) - x
于 2013-04-22T11:00:24.367 回答
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);
于 2013-04-22T10:58:23.440 回答
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& 它的multiply方法。适用于几乎所有东西。

于 2013-04-22T11:00:28.360 回答
-3

加 7 x 次。

for(int i=0; i<10; i++)
    result = result+7;
于 2013-04-22T11:24:19.150 回答