Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! python3
- # -*- encoding: utf-8 -*-
- #https://www.coursera.org/learn/algorithms-divide-conquer
- #Lab 1, Ulf Benjaminsson, 2016-12-14
- import sys;
- NUMBER_A = 3141592653589793238462643383279502884197169399375105820974944592;
- NUMBER_B = 2718281828459045235360287471352662497757247093699959574966967627;
- #(a, b, product)
- def makeTestCase(a, b):
- return (a, b, a*b);
- def makeTestCases():
- return [
- makeTestCase(1, 1),
- makeTestCase(11, 10),
- makeTestCase(-100, 200),
- makeTestCase(314159, 271828),
- makeTestCase(10, 100),
- makeTestCase(-10, 100),
- makeTestCase(NUMBER_A, NUMBER_B)
- ];
- #implements https://en.wikipedia.org/wiki/Grid_method_multiplication
- #As a warmup to more proper algorithms.
- def gridAlgo(a,b):
- negate = not ((a < 0) == (b < 0)); #compare sign of the numbers (mixed sign multiplication = negative result)
- digits_a = [int(i) for i in str(abs(a))];
- digits_b = [int(i) for i in str(abs(b))];
- digits_a.reverse(); #arrange digits in order of magnitude; 1s, 10s, 100s etc
- digits_b.reverse(); #to keep my loops simple. :)
- factors = [[0] * len(digits_b) for i in range(len(digits_a))]; #2 dimensional array of [digits_a x digits_b] indexes
- for pos_a, digit_a in enumerate(digits_a):
- digit_a_value = digit_a * (10**pos_a); #10**pos_a == 10^n == place value in base 10
- for pos_b, digit_b in enumerate(digits_b):
- digit_b_value = digit_b * (10**pos_b); #10**pos_b == 10^n == place value in base 10
- factors[pos_a][pos_b] = digit_a_value * digit_b_value;
- return -sum(sum(factors,[])) if negate else sum(sum(factors,[]));
- #TODO:
- def gradeSchoolAlgo(a,b):
- result = 0;
- return result;
- #TODO:
- def karatsubaAlgo(a,b):
- result = 0;
- return result;
- def multiply(a, b):
- result = gridAlgo(a,b);
- return result;
- def main():
- samples = makeTestCases();
- for (a, b, correctAnswer) in samples:
- result = multiply(a, b);
- passed = result == correctAnswer;
- print('{!s} {:d} x {:d} = {:d}'.format(
- "Passed:" if passed else "\tFailed:", a, b, result)
- );
- if(not passed):
- print('\tShould be: {:d}'.format(correctAnswer)) ;
- return 0;
- if __name__ == '__main__':
- status = main();
- sys.exit(status);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement