How can I multiply really big numbers c++

前端 未结 9 1666
梦谈多话
梦谈多话 2021-01-18 10:09

I have the following code

      int i, a, z;
i = 2343243443;
a = 5464354324324324;
z = i * a;
cout << z << endl;

When these are

相关标签:
9条回答
  • 2021-01-18 10:58

    You should first try to use 64-bit numbers (long or better, unsigned long if everything is positive). With unsigned long you can operate between 0 and 18446744073709551615, with long between -9223372036854775808 and 9223372036854775807.

    If it is not enough, then there is no easy solution, you have to perform your operation at software level using arrays of unsigned long for instance, and overload "<<" operator for display. But this is not that easy, and I guess you are a beginner (no offense) considering the question you asked.

    If 64-bit representation is not enough for you, I think you should consider floating-point representation, especially "double". With double, you can represent numbers between about -10^308 and 10^308. You won't be able to have perfectly accurate computatiosn on very large number (the least significant digits won't be computed), but this should be a good-enough option for whatever you want to do here.

    0 讨论(0)
  • 2021-01-18 11:03

    The result overflows the int (and also std::uint64_t)

    You have to use some BigInt library.

    0 讨论(0)
  • 2021-01-18 11:06

    I would like to elaborate on, and clarify Shravan Kumar's Answer using a full-fledged code. The code starts with a long integers a & b, which are multiplied using array, converted to a string and then back into the long int.

    #include <iostream>
    #include <string>
    #include<algorithm>
    
    using namespace std;
    
    int main()
    {
    //Numbers to be multiplied
    long a=111,b=100;
    
    //Convert them to strings (or character array)
    string arr1 = to_string(a), arr2 = to_string(b); 
    
    //Reverse them
    reverse(arr1.begin(), arr1.end());
    reverse(arr2.begin(), arr2.end());
    
    //Getting size for final result, just to avoid dynamic size
    int ans_size = arr1.size() + arr2.size();
    
    //Declaring array to store final result
    int ans[ans_size]={0};
    
    //Multiplying 
    //In a reverse manner, just to avoid reversing strings explicitly 
    for(int i=0; i<arr1.size();i++)
    {
        for(int j=0; j<arr2.size();j++)
        {
            //Convert array elements (char -> int)
            int p = (int)(arr1[i]) - '0';
            int q = (int)(arr2[j]) - '0';
    
            //Excerpt from Shravan's answer above
            ans[i+j]+=p*q;
            ans[i+j+1]=ans[i+j+1]+ans[i+j]/10;
            ans[i+j]%=10;
        }
    }
    
    //Declare array to store string form of final answer
    string s="";
    
    for(auto i=0;i<ans_size; ++i)
        s += to_string(ans[i]); 
    
    reverse(s.begin(), s.end() );
    
    //If last element is 0, it should be skipped
    if(s[0] =='0')
    {
       string ss(s,1,s.size()-1);
       s=ss;
    }
    
    //Final answer
    cout<< s;
    
    return 0;
    }
    
    0 讨论(0)
提交回复
热议问题