45

I was just going through some basic stuff as I am learning C. I came upon a question to multiply a number by 7 without using the * operator. Basically it's like this

      (x << 3) - x;

Now I know about basic bit manipulation operations, but I can't get how do you multiply a number by any other odd number without using the * operator? Is there a general algorithm for this?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Race
  • 625
  • 2
  • 8
  • 9
  • 8
    that's (8*x)-x or IOW 7x – Anurag Jan 15 '10 at 04:23
  • 2
    Note that most compilers already optimize things like this. I.e., turning 15*x into ((x<<4)-x)) – e.tadeu Jan 15 '10 at 18:01
  • 2
    Algebra :) - (x << 3) - x = 8 * x - x = (8 - 1) * x = 7 * x The trick is that x << 3 == x * 2^3 == 8 – vicatcu Jan 15 '10 at 18:22
  • 2
    Just use the `*` operator; that's what it's for. This is nearly a duplicate of [this question](http://stackoverflow.com/questions/7991341/multiply-by-7-in-efficient-way/7991412). Note that `(x<<3) - x` can overflow for some values of `x` where the simpler and clearer `x * 7` won't. – Keith Thompson Dec 29 '11 at 02:49
  • Related [Java only](https://stackoverflow.com/questions/50639366) duplicate here. – StuartLC Jun 03 '18 at 08:48

31 Answers31

59

Think about how you multiply in decimal using pencil and paper:

  12
x 26
----
  72
 24
----
 312

What does multiplication look like in binary?

   0111
x  0101
-------
   0111
  0000
 0111
-------
 100011

Notice anything? Unlike multiplication in decimal, where you need to memorize the "times table," when multiplying in binary, you are always multiplying one of the terms by either 0 or 1 before writing it down in the list addends. There's no times table needed. If the digit of the second term is 1, you add in the first term. If it's 0, you don't. Also note how the addends are progressively shifted over to the left.

If you're unsure of this, do a few binary multiplications on paper. When you're done, convert the result back to decimal and see if it's correct. After you've done a few, I think you'll get the idea how binary multiplication can be implemented using shifts and adds.

Wayne Conrad
  • 103,207
  • 26
  • 155
  • 191
25

Everyone is overlooking the obvious. No multiplication is involved:

10^(log10(A) + log10(B))
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jim C
  • 4,981
  • 21
  • 25
  • 2
    Which in C would be `exp(log(A) + log(B))`. – David R Tribble Jan 15 '10 at 20:54
  • 3
    I suppose you're being sarcastic, but if you're not, have you ever looked at source code for logn? – Arthur Kalliokoski Feb 10 '10 at 07:10
  • 7
    I looked at it as more of a history lesson then being sarcastic. People today tend to forget we did do thing before we had computers or even electronic calculators. I've seen to many engineers and programs who accept the result from the "magic box" without understanding how it works. No one can know everything, but we should understand as much as we can. I know the general algorithm for computing logs, but I admit I have not studied them in great depth. They od involve shifting which is multiplying in binary as many people have pointed out. Not unexpected, early CPUS can only add and shift. – Jim C Feb 10 '10 at 21:15
  • Even many modern CPUs (small, low-power ones) can't multiply or divide. Why waste microcode on that when it can easily be done in software? – Artelius Jun 23 '10 at 04:23
  • 2
    The old slide rule implementation! Gotta love the scene in Apollo 13 where 10 engineers are simultaneously doing a calculation on their slide rules - multi-core at its infancy! – franji1 Sep 16 '10 at 02:33
  • Shame log10 in C doesn't support negative numbers (complex/imaginary numbers, etc). Wolfram Alpha handles them very well! – Tim Nov 19 '13 at 09:43
  • @jimc: in the best of the cases (CORDIC), logs and exps are computed using shifts and adds only, but requires at least one of each per bit of accuracy; this is more costly than a plain multiply. In other implementations, they require... a lot of multiplies. –  Jan 21 '17 at 17:27
23

The question says:

multiply a number by 7 without using * operator

This doesn't use *:

 number / (1 / 7) 

Edit:
This compiles and works fine in C:

 int number,result;
 number = 8;
 result = number / (1. / 7);
 printf("result is %d\n",result);
Carlos Gutiérrez
  • 13,972
  • 5
  • 37
  • 47
  • +1 for the idea, but it won't work in Java: `java.lang.ArithmeticException: / by zero` since (1 / 7) is done by integer division (workaround is easy) – user85421 Jan 15 '10 at 15:59
  • actually it won't work in c either! I'm pretty sure you'd get a core dump if you ran that line :). – vicatcu Jan 15 '10 at 18:19
  • Will probably fail for some values due to rounding. Will fail if your `int` is 64 bits and `number` is greater than 2^51 or so... – Chris Dodd Jan 15 '10 at 19:38
  • When you are assigning the result to `result` variable, the fractional part is truncated. The means that if the reslt is imprecise (often happens with FP arithmetics), the truncation might easily produce an incorrect result - off by 1. – AnT stands with Russia Jan 15 '10 at 19:41
  • 1
    @Chris Dodd, AndreyT - True, FP can byte you. My point is the idea, not the implementation. – Carlos Gutiérrez Jan 15 '10 at 20:03
  • You still need an explicit cast to convert the `double` result to an `int`. – David R Tribble Jan 15 '10 at 20:57
  • 1
    @Loadmaster: You don't need an explicit cast to convert `double` to `int`. This is a standard conversion in both C and C++, so no cast is needed. The only reason people might use an explicit cast is to suppress some annoying compiler warnings. – AnT stands with Russia Jan 15 '10 at 23:03
  • 1
    JAVA Version: double result = paramThird / ( 1. / (paramFirst / (1. / paramSecond))); System.out.println("result : " + result); – karma Sep 17 '16 at 19:20
19

An integer left shift is multiplying by 2, provided it doesn't overflow. Just add or subtract as appropriate once you get close.

Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358
17
int multiply(int multiplicand, int factor)
{
    if (factor == 0) return 0;

    int product = multiplicand;
    for (int ii = 1; ii < abs(factor); ++ii) {
        product += multiplicand;
    }

    return factor >= 0 ? product : -product;
}

You wanted multiplication without *, you got it, pal!

Tagir Valeev
  • 97,161
  • 19
  • 222
  • 334
  • Wow, thanks dkantowitz. I had no idea! +10 to you my good man! (oh, and *nothing* in the question necessitates bit shifting, but I'm sure you realized that too.) –  Feb 10 '10 at 13:56
  • 9
    -1. This code is broken since instead of adding `multiplicand` to a running sum (initially 0), it adds `multiplicand` to itself, which results in a multiplication of `multiplicand` by `2^(abs(factor)-1)*sgn(factor)` instead of by `factor`. – Alexey Frunze Dec 29 '11 at 01:56
12

It's easy to avoid the '*' operator:

mov eax, 1234h
mov edx, 5678h
imul edx

No '*' in sight. Of course, if you wanted to get into the spirit of it, you could also use the trusty old shift and add algorithm:

mult proc
; Multiplies eax by ebx and places result in edx:ecx
    xor ecx, ecx
    xor edx, edx
mul1:
    test ebx, 1
    jz  mul2
    add ecx, eax
    adc edx, 0
mul2:
    shr ebx, 1
    shl eax, 1
    test ebx, ebx
    jnz  mul1
done:
    ret
mult endp

Of course, with modern processors, all (?) have multiplication instructions, but back when the PDP-11 was shiny and new, code like this saw real use.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jerry Coffin
  • 476,176
  • 80
  • 629
  • 1,111
  • 6
    That's not fair, the question is tagged `c`, `c++`, and `java` ;) – dreamlax Jan 15 '10 at 05:42
  • 10
    @dreamlax: Quite true -- and if somebody reverse engineers the algorithm from assembly code to get an A on their C, C++ or Java homework, I'm willing to believe they probably earned the grade... – Jerry Coffin Jan 15 '10 at 05:47
  • My first home computer was a TRS-80, sporting a zippy 1.7MHz Z80, and I typed in a lot of multiplication routines like this. Turned out the fastest way was to do as many 8x16 bit multiplications as necessary, and add them up. – David Thornley Jan 15 '10 at 15:11
  • 1
    Gotta love x86's LEA instruction... shift and add in a single instruction :) – ephemient Jan 15 '10 at 17:25
  • 2
    Even many modern CPUs (small, low-power ones) can't multiply or divide. Why waste microcode on that when it can easily be done in software? – Artelius Jun 23 '10 at 04:25
10

Mathematically speaking, multiplication distributes over addition. Essentially, this means:

x * (a + b + c ...) = (x * a) + (x * b) + (x * c) ...

Any real number (in your case 7), can be presented as a series of additions (such as 8 + (-1), since subtraction is really just addition going the wrong way). This allows you to represent any single multiplication statement as an equivalent series of multiplication statements, which will come up with the same result:

x * 7
= x * (8 + (-1))
= (x * 8) + (x * (-1))
= (x * 8) - (x * 1)
= (x * 8) - x

The bitwise shift operator essentially just multiplies or divides a number by a power of 2. So long as your equation is only dealing with such values, bit shifting can be used to replace all occurrence of the multiplication operator.

(x * 8) - x = (x * 23) - x = (x << 3) - x

A similar strategy can be used on any other integer, and it makes no difference whether it's odd or even.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
goldPseudo
  • 5,547
  • 1
  • 23
  • 38
8

It is the same as x*8-x = x*(8-1) = x*7

Igor Zevaka
  • 74,528
  • 26
  • 112
  • 128
8

Any number, odd or even, can be expressed as a sum of powers of two. For example,

     1   2   4   8
------------------
 1 = 1
 2 = 0 + 2
 3 = 1 + 2
 4 = 0 + 0 + 4
 5 = 1 + 0 + 4
 6 = 0 + 2 + 4
 7 = 1 + 2 + 4
 8 = 0 + 0 + 0 + 8
11 = 1 + 2 + 0 + 8

So, you can multiply x by any number by performing the right set of shifts and adds.

 1x = x
 2x = 0 + x<<1
 3x = x + x<<1
 4x = 0 +  0   + x<<2
 5x = x +  0   + x<<2
11x = x + x<<1 +   0  + x<<3
Bombe
  • 81,643
  • 20
  • 123
  • 127
benzado
  • 82,288
  • 22
  • 110
  • 138
  • 1
    Useful! But how about scenarios similar to the OP's, such as multiplying by shifting and *subtracting* too? i.e. 6x = (x << 3) - (x << 1) etc? – dreamlax Jan 15 '10 at 04:58
  • I thought the only rule was to avoid the `*` operator. – benzado Jan 15 '10 at 05:05
  • 1
    Also, your table is a little out, 2x is (x << 1), and 4x is (x << 2) etc. – dreamlax Jan 15 '10 at 05:05
  • @dreamlax: a factor with 2 sequential `1`s in the multiplicand can be replaced with the same number of operations doing a subtraction. With more than 2 sequential `1`s, subtracting uses even less operations. – Jongware Sep 13 '14 at 10:27
5

When it comes down to it, multiplication by a positive integer can be done like this:

int multiply(int a, int b) {
  int ret = 0;
  for (int i=0; i<b; i++) {
    ret += b;
  }
  return ret;
}

Efficient? Hardly. But it's correct (factoring in limits on ints and so forth).

So using a left-shift is just a shortcut for multiplying by 2. But once you get to the highest power-of-2 under b you just add a the necessary number of times, so:

int multiply(int a, int b) {
  int ret = a;
  int mult = 1;
  while (mult <= b) {
    ret <<= 1;
    mult <<= 1;
  }
  while (mult < b) {
    ret += a;
  }
  return ret;
}

or something close to that.

To put it another way, to multiply by 7.

  • Left shift by 2 (times 4). Left shift 3 is 8 which is >7;
  • Add b 3 times.
GManNickG
  • 494,350
  • 52
  • 494
  • 543
cletus
  • 616,129
  • 168
  • 910
  • 942
  • 4
    In your first example, you either mean: `ret += a;` or `i < a`. You should mention that it assumes non-negatives integers in the "and so forth". – jamesdlin Jan 15 '10 at 04:27
  • I dont get it....What do we add 3 times?? Like if the the number is 7 to be mulitplied by 7, like I wrote, it is left shift by 3 and subtract 7, the result is 49. What exactly is b? Pardon my lack of knowledge. – Race Jan 15 '10 at 04:37
4

One evening, I found that I was extremely bored, and cooked this up:

#include <iostream>

typedef unsigned int uint32;

uint32 add(uint32 a, uint32 b) {
    do {
        uint32 s = a ^ b;
        uint32 c = a & b;
        a = s;
        b = c << 1;
    } while (a & b)
    return (a | b)
}

uint32 mul(uint32 a, uint32 b) {
    uint32 total = 0;
    do {
        uint32 s1 = a & (-(b & 1))
        b >>= 1; a <<= 1;
        total = add(s1, total)
    } while (b)
    return total;
}

int main(void) {
    using namespace std;
    uint32 a, b;

    cout << "Enter two numbers to be multiplied: ";
    cin >> a >> b;

    cout << "Total: " << mul(a,b) << endl;
    return 0;
}

The code above should be quite self-explanatory, as I tried to keep it as simple as possible. It should work, more or less, the way a CPU might perform these operations. The only bug I'm aware of is that a is not permitted to be greater than 32,767 and b is not permitted to be large enough to overflow a (that is, multiply overflow is not handled, so 64-bit results are not possible). It should even work with negative numbers, provided the inputs are appropriately reinterpret_cast<>.

greyfade
  • 24,948
  • 7
  • 64
  • 80
4

O(log(b)) method

public int multiply_optimal(int a, int b) {

    if (a == 0 || b == 0)
        return 0;
    if (b == 1)
        return a;
    if ((b & 1) == 0)
        return multiply_optimal(a + a, b >> 1);
    else
        return a + multiply_optimal(a + a, b >> 1);

}

The resursive code works as follows:
Base case:
if either of the number is 0 ,product is 0.
if b=1, product =a.

If b is even:
ab can be written as 2a(b/2)
2a(b/2)=(a+a)(b/2)=(a+a)(b>>1) where'>>' arithematic right shift operator in java.

If b is odd:
ab can be written as a+a(b-1)
a+a(b-1)=a+2a(b-1)/2=a+(a+a)(b-1)/2=a+(a+a)((b-1)>>1)
Since b is odd (b-1)/2=b/2=b>>1
So ab=a+(2a*(b>>1))
NOTE:each recursive call b is halved => O(log(b))

Freeze Francis
  • 517
  • 8
  • 18
3
unsigned int Multiply(unsigned int m1, unsigned int m2)
{
    unsigned int numBits = sizeof(unsigned int) * 8; // Not part of the core algorithm
    unsigned int product = 0;
    unsigned int mask = 1;
    for(int i =0; i < numBits; ++i, mask = mask << 1)
    {
        if(m1 & mask)
        {
            product += (m2 << i);
        }
    }
    return product;
}
Andrew Shepherd
  • 44,254
  • 30
  • 139
  • 205
2

@Wang, that's a good generalization. But here is a slightly faster version. But it assumes no overflow and a is non-negative.

int mult(int a, int b){
    int p=1;
    int rv=0;
    for(int i=0; a >= p && i < 31; i++){
        if(a & p){
            rv += b;
        }
        p = p << 1;
        b = b << 1;
    }

    return rv;
}

It will loop at most 1+log_2(a) times. Could be faster if you swap a and b when a > b.

Apprentice Queue
  • 2,036
  • 13
  • 13
2
unsigned int Multiply( unsigned int a, unsigned int b )
{
    int ret = 0;
    // For each bit in b
    for (int i=0; i<32; i++) {

        // If that bit is not equal to zero
        if (( b & (1 << i)) != 0) {

            // Add it to our return value
            ret += a << i;
        }
    }
    return ret;
}

I avoided the sign bit, because it's kind of not the subject of the post. This is an implementation of what Wayne Conrad said basically. Here is another problem is you want to try more low level math operations. Project Euler is cool!

Community
  • 1
  • 1
David Stocking
  • 1,200
  • 15
  • 26
2

Shift and add doesn't work (even with sign extension) when the multiplicand is negative. Signed multiplication has to be done using Booth encoding:

Starting from the LSB, a change from 0 to 1 is -1; a change from 1 to 0 is 1, otherwise 0. There is also an implicit extra bit 0 below the LSB.

For example, the number 5 (0101) will be encoded as: (1)(-1)(1)(-1). You can verify this is correct:

5 = 2^3 - 2^2 + 2 -1

This algorithm also works with negative numbers in 2's complement form:

-1 in 4-bit 2's complement is 1111. Using the Booth algorithm: (1)(0)(0)(0)(-1), where there is no space for the leftmost bit 1 so we get: (0)(0)(0)(-1) which is -1.

/* Multiply two signed integers using the Booth algorithm */
int booth(int x, int y)
{
    int prev_bit = 0;
    int result = 0;

    while (x != 0) {
        int current_bit = x & 0x1;
        if (prev_bit & ~current_bit) {
            result += y;
        } else if (~prev_bit & current_bit) {
            result -= y;
        }

        prev_bit = current_bit;

        x = static_cast<unsigned>(x) >> 1;
        y <<= 1;
    }

    if (prev_bit)
        result += y;

    return result;
}

The above code does not check for overflow. Below is a slightly modified version that multiplies two 16 bit numbers and returns a 32 bit number so it never overflows:

/* Multiply two 16-bit signed integers using the Booth algorithm */
/* Returns a 32-bit signed integer */
int32_t booth(int16_t x, int16_t y)
{
    int16_t prev_bit = 0;
    int16_t sign_bit = (x >> 16) & 0x1;
    int32_t result = 0;
    int32_t y1 = static_cast<int32_t>(y);

    while (x != 0) {
        int16_t current_bit = x & 0x1;
        if (prev_bit & ~current_bit) {
            result += y1;
        } else if (~prev_bit & current_bit) {
            result -= y1;
        }

        prev_bit = current_bit;

        x = static_cast<uint16_t>(x) >> 1;
        y1 <<= 1;
    }

    if (prev_bit & ~sign_bit)
        result += y1;

    return result;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
2
import java.math.BigInteger;

public class MultiplyTest {
    public static void main(String[] args) {
        BigInteger bigInt1 = new BigInteger("5");
        BigInteger bigInt2 = new BigInteger("8");
        System.out.println(bigInt1.multiply(bigInt2));
    }
}
Sean Patrick Floyd
  • 292,901
  • 67
  • 465
  • 588
1

In C#:

private static string Multi(int a, int b)
{
    if (a == 0 || b == 0)
        return "0";

    bool isnegative = false;

    if (a < 0 || b < 0)
    {
        isnegative = true;

        a = Math.Abs(a);

        b = Math.Abs(b);
    }

    int sum = 0;

    if (a > b)
    {
        for (int i = 1; i <= b; i++)
        {
            sum += a;
        }
    }
    else
    {
        for (int i = 1; i <= a; i++)
        {
            sum += b;
        }
    }

    if (isnegative == true)
        return "-" + sum.ToString();
    else
        return sum.ToString();
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
1

JAVA:
Considering the fact, that every number can be splitted into powers of two:

1 = 2 ^ 0
2 = 2 ^ 1
3 = 2 ^ 1 + 2 ^ 0
...

We want to get x where:
x = n * m

So we can achieve that by doing following steps:

1.   while m is greater or equal to 2^pow:
     1.1  get the biggest number pow, such as 2^pow is lower or equal to m
     1.2  multiply n*2^pow and decrease m to m-2^pow
2.   sum the results

Sample implementation using recursion:

long multiply(int n, int m) {
    int pow = 0;
    while (m >= (1 << ++pow)) ;
    pow--;
    if (m == 1 << pow) return (n << pow);
    return (n << pow) + multiply(n, m - (1 << pow));
}

I got this question in last job interview and this answer was accepted.

EDIT: solution for positive numbers

Michał Szewczyk
  • 7,540
  • 8
  • 35
  • 47
1

This is the simplest C99/C11 solution for positive numbers:

unsigned multiply(unsigned x, unsigned y) { return sizeof(char[x][y]); }
chqrlie
  • 131,814
  • 10
  • 121
  • 189
1

If you can use the log function:

public static final long multiplyUsingShift(int a, int b) {
    int absA = Math.abs(a);
    int absB = Math.abs(b);

    //Find the 2^b which is larger than "a" which turns out to be the 
    //ceiling of (Log base 2 of b) == numbers of digits to shift
    double logBase2 = Math.log(absB) / Math.log(2);
    long bits = (long)Math.ceil(logBase2);

    //Get the value of 2^bits
    long biggerInteger = (int)Math.pow(2, bits);

    //Find the difference of the bigger integer and "b"
    long difference = biggerInteger - absB;

    //Shift "bits" places to the left
    long result = absA<<bits;

    //Subtract the "difference" "a" times
    int diffLoop = Math.abs(a);
    while (diffLoop>0) {
        result -= difference;
        diffLoop--;
    }

    return (a>0&&b>0 || a<0&&b<0)?result:-result;
}

If you cannot use the log function:

public static final long multiplyUsingShift(int a, int b) {
    int absA = Math.abs(a);
    int absB = Math.abs(b);

    //Get the number of bits for a 2^(b+1) larger number
    int bits = 0;
    int bitInteger = absB;
    while (bitInteger>0) {
        bitInteger /= 2;
        bits++;
    }

    //Get the value of 2^bit
    long biggerInteger = (int)Math.pow(2, bits);

    //Find the difference of the bigger integer and "b"
    long difference = biggerInteger - absB;

    //Shift "bits" places to the left
    long result = absA<<bits;

    //Subtract the "difference" "a" times
    int diffLoop = absA;
    while (diffLoop>0) {
        result -= difference;
        diffLoop--;
    }

    return (a>0&&b>0 || a<0&&b<0)?result:-result;
}

I found this to be more efficient:

public static final long multiplyUsingShift(int a, int b) {
    int absA = Math.abs(a);
    int absB = Math.abs(b);

    long result = 0L;
    while (absA>0) {
        if ((absA&1)>0) result += absB; //Is odd
        absA >>= 1;
        absB <<= 1;
    }

    return (a>0&&b>0 || a<0&&b<0)?result:-result;
}

and yet another way.

public static final long multiplyUsingLogs(int a, int b) {
    int absA = Math.abs(a);
    int absB = Math.abs(b);
    long result = Math.round(Math.pow(10, (Math.log10(absA)+Math.log10(absB))));
    return (a>0&&b>0 || a<0&&b<0)?result:-result;
}
Justin
  • 4,196
  • 4
  • 24
  • 48
0
package com.amit.string;

// Here I am passing two values, 7 and 3 and method getResult() will
// return 21 without use of any operator except the increment operator, ++.
//
public class MultiplyTwoNumber {

    public static void main(String[] args) {
        int a = 7;
        int b = 3;
        System.out.println(new MultiplyTwoNumber().getResult(a, b));
    }

    public int getResult(int i, int j) {
        int result = 0;

        // Check for loop logic it is key thing it will go 21 times
        for (int k = 0; k < i; k++) {
            for (int p = 0; p < j; p++) {
                result++;
            }
        }
        return result;
    }
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Amit Sinha
  • 11
  • 5
  • Rather than only post a block of code, please *explain* why this code solves the problem posed. Without an explanation, this is not an answer. – Martijn Pieters Dec 07 '12 at 22:08
  • And please be careful about the indentation of code. If the posted code is hard to read then it is lesser helpful. – Gabor Garami Dec 07 '12 at 22:10
0
public static int multiply(int a, int b) 
{
    int temp = 0;
    if (b == 0) return 0;
    for (int ii = 0; ii < abs(b); ++ii) {
        temp = temp + a;
    }

    return b >= 0 ? temp : -temp;
}

public static int abs(int val) {

    return val>=0 ? val : -val;
}
Michelle
  • 2,830
  • 26
  • 33
0

Another thinking-outside-the-box answer:

BigDecimal a = new BigDecimal(123);
BigDecimal b = new BigDecimal(2);
BigDecimal result = a.multiply(b);
System.out.println(result.intValue());
Igor Nadj
  • 324
  • 2
  • 9
0

Loop it. Run a loop seven times and iterate by the number you are multiplying with seven.

Pseudocode:

total = 0
multiply = 34

loop while i < 7

    total = total + multiply

endloop
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Thomas Winsnes
  • 1,961
  • 1
  • 13
  • 15
0
public static void main(String[] args) {
    System.out.print("Enter value of A -> ");
    Scanner s=new Scanner(System.in);
    double j=s.nextInt();
    System.out.print("Enter value of B -> ");
    Scanner p=new Scanner(System.in);
    double k=p.nextInt();
    double m=(1/k);
    double l=(j/m);
    System.out.print("Multiplication of A & B=> "+l);
}
  • This approach has been suggested several years ago in answer http://stackoverflow.com/a/2069878/2564301. Other than being in Java, it does not seem to add to the discussion. – Jongware Sep 13 '14 at 10:32
0

A JavaScript approach for positive numbers

function recursiveMultiply(num1, num2){
    const bigger = num1 > num2 ? num1 : num2; 
    const smaller = num1 <= num2 ? num1 : num2; 
    const indexIncrement = 1;
    const resultIncrement = bigger;

    return recursiveMultiplyHelper(bigger, smaller, 0, indexIncrement, resultIncrement)
}

function recursiveMultiplyHelper(num1, num2, index, indexIncrement, resultIncrement){
    let result = 0;
    if (index === num2){
        return result;
    } 

    if ((index+indexIncrement+indexIncrement) >= num2){
        indexIncrement = 1;
        resultIncrement = num1;
    } else{
        indexIncrement += indexIncrement;
        resultIncrement += resultIncrement;
    }

    result = recursiveMultiplyHelper(num1, num2, (index+indexIncrement), indexIncrement, resultIncrement);
    result += resultIncrement;
    console.log(num1, num2, index, result);

    return result;
}
Eliago
  • 3
  • 3
0

Think about the normal multiplication method we use

         1101 x        =>13
         0101          =>5
---------------------
         1101
        0000
       1101
      0000
===================        
      1000001 .        => 65

Writing the same above in the code

#include<stdio.h>

int multiply(int a, int b){
    int res = 0,count =0;
    while(b>0) {
        if(b & 0x1)
            res = res + (a << count);
        b = b>>1;
        count++;
    }
    return res;
}
int main() {
    printf("Sum of x+y = %d", multiply(5,10));
    return 0;
}
Sorcrer
  • 1,634
  • 1
  • 14
  • 27
-1

Very simple, pal... Each time when you left shift a number it means you are multiplying the number by 2 which means the answer is (x<<3)-x.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
ram
  • 1
-1

To multiply of two numbers without * operator:

int mul(int a,int b) {
    int result = 0;
    if(b > 0) {
        for(int i=1;i<=b;i++){
            result += a;
        }
    }
    return result;
}
xlm
  • 6,854
  • 14
  • 53
  • 55
-3

Ugly and slow and untested, but...

int mult(a,b){
    int i, rv=0;
    for(i=0; i < 31; ++i){
        if(a & 1<<i){
            rv += b << i;
        }
    }
    if(a & 1<<31){ // two's complement
        rv -= b<<31;
    }
    return rv;
}
MD XF
  • 7,860
  • 7
  • 40
  • 71
Wang
  • 3,247
  • 1
  • 21
  • 33