Wednesday, 16 December 2015

#LeetCode# Multiply Strings lenthy but straightforward algorithm!

class Solution {

public:

   void add(char str1[],char str2[]){  //function to add two strings

       int l1=strlen(str1);

       int l2=strlen(str2);

      // char result[100000];

       int i=l1-1,j=l2-1;

      // cout << l1 << " " << l2 << endl;

       int carry=0;

       stack < int > s;

       while(i>=0 && j>=0){

           int sum=carry+(str1[i]-'0')+(str2[j]-'0');

           carry=sum/10;

           sum=sum%10;

           s.push(sum+48);

           i--;

           j--;

       }

       if(i==-1 && j==-1 && carry!=0){

           s.push(carry+48);

       }

       if(i>=0){

           while(i>=0){

           int sum=carry+(str1[i]-'0');

           carry=sum/10;

           sum=sum%10;

           s.push(sum+48);

  i--;}

       if(i==-1 && carry!=0){

           s.push(carry+48);

       }

       }

       if(j>=0){

           while(j>=0){

           int sum=carry+(str2[j]-'0');

           carry=sum/10;

           sum=sum%10;

           s.push(sum+48);

  j--;}

       if(j==-1 && carry!=0){

           s.push(carry+48);

          }

       }

      int k=0;

      while(!s.empty()){

          str1[k]=s.top();

          s.pop();

          k++;

      }

      str1[k]='\0';

      //return result;

     

   }

    string multiply(string num1, string num2) {

        int l1=num1.size();

        int l2=num2.size();

        if(num1[0]=='0')

          return "0";

        if(num2[0]=='0')

          return "0";

        char mult[100000];

        char result[100000];

        result[0]='\0';

        if(l1==0 && l2==0)

          return "";

        if(l1>=l2){   //if nums2 is smaller

       

            int j=l2-1;

            stack < char > s;

            int cnt=0;

            while(j>=0){

            int n1=num2[j]-'0';

            int i=l1-1;

              int carry=0;

            int c=0;

            while(c!=cnt){

             s.push(48);

             c++;}

             while(i>=0){

             int n2=num1[i]-'0';

             int sum=carry+(n1*n2);

             carry=(sum)/10;

             s.push((sum%10)+48);

             i--;

             }

             if(carry){

                 s.push(carry+48);

             }

             int k=0;

             while(!s.empty()){

                 mult[k++]=s.top();

                 s.pop();

             }

             mult[k]='\0';


             add(result,mult);

             cnt++;

j--;

            }

        }

        else{ //if nums1 is smaller

            int j=l2-1;

            stack < char > s;

            int cnt=0;

            while(j>=0){

            int n1=num2[j]-'0';

            int i=l1-1;

            int carry=0;

            int c=0;

            while(c!=cnt){

             s.push(48);

             c++;}

             while(i>=0){

             int n2=num1[i]-'0';

             int sum=carry+(n1*n2);

             carry=(sum)/10;

             s.push((sum%10)+48);

             i--;

             }

             if(carry){

                 s.push(carry+48);

             }

             int k=0;

             while(!s.empty()){

                 mult[k++]=s.top();

                 s.pop();

             }

             mult[k]='\0';


             add(result,mult);


             cnt++;

j--;

            }

        }

        return (string)result;

    }

};

No comments:

Post a Comment