在不使用*运算符的情况下乘以数字

时间:2013-04-22 10:55:34

标签: java c++

我正在经历一个编程课程,并被问到这个棘手的问题,直到课程结束才得到答案。

问题

如何将任何输入(Float,int等)乘以7, without using the *运营商 在TWO steps

如果有人能够通过解释给我这个问题的答案,那将非常有帮助。

  

有两个步骤我的意思是假设你正在运行一个循环(i = 0; i <7; i ++)in   那个案例的步数将是&gt; 2,也是TYPE CONVERSION,   DIVISION,ADDITION等(计算步骤)。

8 个答案:

答案 0 :(得分:34)

假设范围中定义了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

答案 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;