Friday, September 11, 2015

[MAth] Multiply Strings

1. Exmaple
reverse, [i+j]+=[i]+[j], charAt(0)
11*5 =55 reverse 055
a=12
b=23
axb =
c[Index sum = 2len-2] =  a[len-1]*b[len-1] =6
c[index sum = 2len-3] =  a[len-2]*b[len-1] + a[len-1]*b[len-2] = 1*3+2*2=7
c[inde sum = 0]           =  a[0]*b[0] = 1*2=2
    0 1 2
a=111
b = 12
     0  1
[0]*[0] = first digit
[1]*[0]+[0]*[1] = 1 last three digit
[1]*[1]+[2]*[0] = 2 last two digit
[2]*[1] =3 last digit
  222
111
1332=>4 digit = a's digit+ b's digit-1 = 4

2. Implementation
carry =0
int sum = carry + c[]
carry = sum/10;
if (carry ==1)
{
  // res.append("1");
res.append(carry);
}
res.reverse().toString();


sum[i+j] += (int)(n1.charAt(i)-'0')+(int)(n2.charAt(j)-'0');



if (i+1< sum.elngth) 

 sum[i+1]+= carry;


res.reverse().toString();  takes (m+n) time

while ( res.charAt(0)=='0' && res.length() > 1 ) res.deleteCharAt(0);


public String multiply(String num1, String num2)
{





    // validate the input
    if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0)
       return "";





     int[] sum = new int[num1.length()+num2.length()];
     int carry = 0;
     //StringBuilder num1r = new StringBuilder(num1);
     //num1 = num1r.reverse().toString();
     //StringBuidlder num2r = new StringBuilder(num2);
     //num2 = num2r.reverse().toString();
     String n1 = new StringBuilder(num1).reverse().toString();
     String n2 = new StringBuidler(num2).reverse().toString();






     for (int i = 0 ; i < n1.length(); i++)
     {
         for (int j = 0; j < n2.length();j++)
         {
            //sum[i+j] = carry + (int)( n1.charAt(i) - '0')*(int) (n2.charAt(j) - '0');
            //carry = sum[i+j] / 10;
            // NOTE: sum[i+j] is accumulating and not possible to only get digit
            sum[i+j] += (int)(n1.charAt(i)-'0')+(int)(n2.charAt(j)-'0');
         }
     }
     //sum[num1.length()+num2.length()-1] = carry;




     


     StringBuidler res = new StringBuilder();
     //for ( int i = sum.length-1 ; i >=0;i--)
     //   res.append(sum[i]);
     
     for (int i = 0; i < sum.length;i++)
     {



          int carry = sum[i]/10;
          int digit = sum[i]%10;
          if (i+1< sum.elngth)
             sum[i+1]+= carry;



          res.append(digit);



     }
     res.reverse().toString();


   
  

     while ( res.charAt(0)=='0' && res.length() > 1 )
          res.deleteCharAt(0);




   
      //return res.toString().trim();
      return res.toString();   




}
  [2][1][0] 
a= 1  1  1
    [1] [0]
b =  1   2



0 +[0][0] 0
c +[0][1] 1
c +[1][0] 1
c +[1][1] 2
c +[2][0] 2
c+ [2][1] 3
c[2+3-1] = c XXX
3. Similar ones
(M) Add Two Numbers
(E) Plus One
(E) Add Binary

No comments:

Post a Comment