Умножение числа без использования оператора *
Я проходил класс программирования и задавался этот сложный вопрос, который остался без ответа до конца класса.
Вопрос:
Как я могу умножить любой ввод (Float, int и т.д.) на 7,
Оператор without using the
*
в TWO steps
.
Если кто-нибудь может дать мне ответ на этот вопрос с объяснением, это будет очень полезно.
С двумя ШАГАМИ Я имею в виду, что вы используете цикл (i = 0; я < 7; я ++) в в этом случае число шагов будет > 2, также TYPE CONVERSION, DIVISION, ADDITION и т.д. (Подсчет шагов).
Ответы
Ответ 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;