Multiplying BigInts

前端 未结 1 1514
遥遥无期
遥遥无期 2021-01-28 05:04

class   BigInt
{
private:
    string data;
    bool isNegative;
};

BigInt multiplication(BigInt left, BigInt right)
{
    BigInt sum;
    BigInt result;
    sum.da         


        
1条回答
  •  北海茫月
    2021-01-28 05:25

    This is a solution from geeksforgeeks which is very similar to what you are trying to do. I modified it to fit your class there might be an error as I have not compiled it.

    BigInt multiplication(BigInt num1, BigInt num2)
    {
        int n1 = num1.data.size();
        int n2 = num2.data.size();
        if (n1 == 0 || n2 == 0)
           return "0";
    
        // will keep the result number in vector
        // in reverse order
        vector result(n1 + n2, 0);
    
        // Below two indexes are used to find positions
        // in result. 
        int i_n1 = 0; 
        int i_n2 = 0; 
    
        // Go from right to left in num1
        for (int i=n1-1; i>=0; i--)
        {
            int carry = 0;
            int n1 = num1.data[i] - '0';
    
            // To shift position to left after every
            // multiplication of a digit in num2
            i_n2 = 0; 
    
            // Go from right to left in num2             
            for (int j=n2-1; j>=0; j--)
            {
                // Take current digit of second number
                int n2 = num2[j].data - '0';
    
                // Multiply with current digit of first number
                // and add result to previously stored result
                // at current position. 
                int sum = n1*n2 + result[i_n1 + i_n2] + carry;
    
                // Carry for next iteration
                carry = sum/10;
    
                // Store result
                result[i_n1 + i_n2] = sum % 10;
    
                i_n2++;
            }
    
            // store carry in next cell
            if (carry > 0)
                result[i_n1 + i_n2] += carry;
    
            // To shift position to left after every
            // multiplication of a digit in num1.
            i_n1++;
        }
    
        // ignore '0's from the right
        int i = result.size() - 1;
        while (i>=0 && result[i] == 0)
           i--;
    
        // If all were '0's - means either both or
        // one of num1 or num2 were '0'
        if (i == -1)
           return "0";
    
        // generate the result string
        string s = "";
        while (i >= 0)
            s += std::to_string(result[i--]);
        BigInt temp(s, num1.isNegative ^ num2.isNegative);
        return temp;
    }
    

    Hope this helps.

    0 讨论(0)
提交回复
热议问题