Подтвердить что ты не робот

Умножение числа без использования оператора *

Я проходил класс программирования и задавался этот сложный вопрос, который остался без ответа до конца класса.

Вопрос:

Как я могу умножить любой ввод (Float, int и т.д.) на 7, Оператор without using the * в TWO steps.

Если кто-нибудь может дать мне ответ на этот вопрос с объяснением, это будет очень полезно.

С двумя ШАГАМИ Я имею в виду, что вы используете цикл (i = 0; я < 7; я ++) в в этом случае число шагов будет > 2, также TYPE CONVERSION, DIVISION, ADDITION и т.д. (Подсчет шагов).

4b9b3361

Ответ 1

Предполагается, что float x или double x определяется в области. Затем я вижу следующие возможности для умножения на 7 без использования оператора *:

В С++ вы можете использовать стандартные функторы (первый шаг: создать функтор, второй шаг: call functor):

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

Ответ 2

Вы можете просто использовать деление на седьмой:

x / (1.0 / 7)

Будет ли это считаться "двумя шагами", полностью зависит от вашего определения.

Ответ 3

добавить его

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

Ответ 4

В 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, я считаю, что подобный трюк также должен быть там.

Обратите внимание, однако, что этот хак обычно не дает правильных результатов для subnormal, бесконечных или NaN-входов, а также для входов так большой по величине, что их умножение на 8 будет переполняться.

Настройка кода для использования удвоений вместо float остается как упражнение для читателя. (Подсказка: магическое число - 52.)

Ответ 5

Вы также можете сделать следующее для целых чисел:

( x<< 3) - x

Ответ 6

Определите "два шага"...

float result = 0.0f;
float input = 3.14f;
int times = 7;

// steps

while (times--)
    result += input;

Изменить: деление на (1/7) не будет работать с типом int. Также на некоторых языках для работы с float-типом вам нужно будет пометить их как float:

result = input / (1.0f / 7.0f);

Ответ 7

// 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. Работает практически во всем.

Ответ 8

Добавьте 7 x раз.

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