You are on page 1of 5

public String multiply(String num1, String num2){ int product, carry=0, sum=0; String result = new String(""); String

partial = new String(""); ArrayList<String> partialList = new ArrayList<String>(); /* computing partial products using this loop. */ for(int j=num2.length()-1 ; j>=0 ; j--) { for(int i=num1.length()-1 ; i>=0 ; i--) { product = Integer.parseInt((new Character(num1.charAt(i))).toString()) * Integer.parseInt((new Character(num2.charAt(j))).toString()) + carry; carry = product/10; partial = Integer.toString(product%10) + partial; } if(carry != 0) partial = Integer.toString(carry) + partial; partialList.add(partial); partial = ""; carry = 0; } /* appending zeroes incrementally */ for(int i=0 ; i<partialList.size() ; i++) partialList.set(i, partialList.get(i) + (Long.toString( (long)java.lang.Math.pow(10.0,(double)i))).substring(1) ); /* getting the size of the largest partial product(last) */ int largestPartial = partialList.get(partialList.size()-1).length(); /* prefixing zeroes */ int zeroes; for(int i=0 ; i<partialList.size() ; i++) { zeroes = largestPartial - partialList.get(i).length(); if(zeroes >= 1) partialList.set(i, (Long.toString( (long)java.lang.Math.pow(10.0,(double)zeroes))).substring(1) + partialList.get(i) ); } /* to compute the result */ carry = 0; for(int i=largestPartial-1 ; i>=0 ; i--) {

sum = 0; for(int j=0 ; j<partialList.size() ; j++) sum = sum + Integer.parseInt(new Character(partialList.get(j).charAt(i)).toString()); sum = sum + carry; carry = sum/10; result = Integer.toString(sum%10) + result; } if(carry != 0) result = Integer.toString(carry) + result; return result; }
share|improve this answer

2.

int int int int int int int int int int

int bigger = t1.length; smaller = t2.length; resultLength = bigger + smaller; []resultTemp = new int[resultLength]; []result = new int[bigger + smaller]; []temporary = new int[resultLength+1]; z = resultLength-1; zet = z; step = 0; carry = 0; modulo = 0;

for(int i=smaller-1; i>=0; i--){ for(int k = bigger-1; k>= -1; k--){ if(k == -1 && carry != 0 ){ resultTemp[z] = carry; carry = 0; break; } else if(k == -1 && carry == 0){ resultTemp[z] = 0; break; } resultTemp[z] = carry + t1[k]*t2[i]; carry = 0;

if( resultTemp[z] > 9 ){ modulo = resultTemp[z] % 10; carry = resultTemp[z]/10; resultTemp[z] = modulo; } else{ resultTemp[z] = resultTemp[z]; } z--; } temporary = add(resultTemp, result); result = copyArray(temporary); resultTemp = clear(resultTemp); z = zet; step++; z = z - step; }

3.

def carries(digitlist): digitlist.reverse() for idx,digit in enumerate(digitlist): if digit>9: newdigit = digit%10 carry = (digit-newdigit)/10 digitlist[idx] = newdigit if idx+1 > len(digitlist)-1: digitlist.append(carry) else: digitlist[idx+1] += carry digitlist.reverse() return True

def multiply(first,second): digits = [0 for place in range(len(first)+len(second))] for fid,fdig in enumerate(reversed(first)): for sid,sdig in enumerate(reversed(second)): offset = fid+sid mult = fdig*sdig digits[offset] += mult digits.reverse() carries(digits) return digits def prettify(digitlist):

return ''.join(list(`i` for i in digitlist)) Then we can call it: a = [1,2,3,4,7,6,2] b = [9,8,7,9] mult = multiply(a,b) print prettify(a)+"*"+prettify(b) print "calc:",prettify(mult) print "real:",int(prettify(a))*int(prettify(b)) Yields: 1234762*9879 calc: 12198213798 real: 12198213798

4.

#include <stdio.h>

#include <string.h> /* c = a * b. Caller is responsible for memory.

c must not be the same as either a or b. */ void longmulti(char *a, char *b, char *c) { int i = 0, j = 0, k = 0, n, carry; int la, lb; /* either is zero, return "0" */ if (!strcmp(a, "0") || !strcmp(b, "0")) { c[0] = '0', c[1] = '\0'; return; } /* see if either a or b is negative */ if (a[0] == '-') { i = 1; k = !k; } if (b[0] == '-') { j = 1; k = !k; } /* if yes, prepend minus sign if needed and skip the sign */

if (i || j) { if (k) c[0] = '-'; longmulti(a + i, b + j, c + k); return; } la = strlen(a); lb = strlen(b); memset(c, '0', la + lb); c[la + lb] = '\0'; # define I(a) (a - '0') for (i = la - 1; i >= 0; i--) { for (j = lb - 1, k = i + j + 1, carry = 0; j >= 0; j--, k--) { n = I(a[i]) * I(b[j]) + I(c[k]) + carry; carry = n / 10; c[k] = (n % 10) + '0'; } c[k] += carry; } # undef I if (c[0] == '0') memmove(c, c + 1, la + lb); return; } int main() { char c[1024]; longmulti("-18446744073709551616", "-18446744073709551616", c); printf("%s\n", c); return 0; }

You might also like