不使用*运算符将数字相乘

Multiplying a number without using * operator

本文关键字:数字 运算符      更新时间:2023-10-16

我正在学习一个编程类,有人问我这个棘手的问题,直到课程结束都没有得到回答。

问题

如何将任何输入(Float、int等(乘以7,without using the *运算符在CCD_ 3中。

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

通过两个步骤,我的意思是假设您在中运行一个循环(I=0;I<7;I++(步骤的情况数将>2,也就是TYPE CONVERSION,DIVISION、ADDITION等(步骤计数(

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

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

x / (1.0 / 7)

这是否算"两步走"完全取决于你的定义。

添加

//initialise s as the number to be multiplied
 sum=0
for(i=0;i<7;i++)
    sum+=s

在C中,以下破解应该适用于以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向后兼容,我相信类似的技巧也应该存在。

然而,请注意,这种破解通常不会为亚正常、无限或NaN输入提供正确的结果,也不会为幅度大到将其乘以8会溢出的输入提供正确结果。

将代码调整为使用doubles而不是float留给读者练习。(提示:幻数是52。(

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

( x<< 3) - x
// 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&其CCD_ 12方法。适用于几乎所有的东西。

定义"两个步骤"。。。

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);

将7乘以x。

for(int i=0; i<10; i++)
    result = result+7;