|
1 | 1 | #!/usr/bin/env python |
2 | | -#coding:utf-8 |
| 2 | +# coding:utf-8 |
3 | 3 |
|
4 | 4 | """ |
5 | 5 | 对于大整数计算,一般都要用某种方法转化,否则会溢出。但是python无此担忧了。 |
|
18 | 18 |
|
19 | 19 | """ |
20 | 20 |
|
21 | | -def arabic_multiplication(num1,num2): |
22 | | - num_lst1 = [int(i) for i in str(num1)] #将int类型的123,转化为list类型的[1,2,3],每个元素都是int类型 |
| 21 | + |
| 22 | +def arabic_multiplication(num1, num2): |
| 23 | + num_lst1 = [int(i) for i in str(num1)] # 将int类型的123,转化为list类型的[1,2,3],每个元素都是int类型 |
23 | 24 | num_lst2 = [int(i) for i in str(num2)] |
24 | 25 |
|
25 | | - #两个list中整数两两相乘 |
26 | | - int_martix = [[i*j for i in num_lst1] for j in num_lst2] |
27 | | - |
28 | | - #将上述元素为数字的list转化为元素类型是str,主要是将9-->'09' |
29 | | - str_martix = [map(convert_to_str,int_martix[i]) for i in range(len(int_martix))] |
30 | | - |
31 | | - #将上述各个list中的两位数字分开:['01','29','03']-->[0,2,0],[1,9,3] |
32 | | - martix = [[int(str_martix[i][j][z]) for j in range(len(str_martix[i]))] for i in range(len(str_martix)) for z in range(2)] |
33 | | - |
34 | | - #计算阿拉伯乘法表的左侧开始各项和 |
| 26 | + # 两个list中整数两两相乘 |
| 27 | + int_martix = [[i * j for i in num_lst1] for j in num_lst2] |
| 28 | + |
| 29 | + # 将上述元素为数字的list转化为元素类型是str,主要是将9-->'09' |
| 30 | + str_martix = [map(convert_to_str, int_martix[i]) for i in range(len(int_martix))] |
| 31 | + |
| 32 | + # 将上述各个list中的两位数字分开:['01','29','03']-->[0,2,0],[1,9,3] |
| 33 | + martix = [[int(str_martix[i][j][z]) for j in range(len(str_martix[i]))] for i in range(len(str_martix)) for z in |
| 34 | + range(2)] |
| 35 | + |
| 36 | + # 计算阿拉伯乘法表的左侧开始各项和 |
35 | 37 | sum_left = summ_left(martix) |
36 | 38 |
|
37 | | - #计算阿拉伯乘法表的底部开始各项和 |
| 39 | + # 计算阿拉伯乘法表的底部开始各项和 |
38 | 40 | sum_end = summ_end(martix) |
39 | 41 |
|
40 | | - #将上述两个结果合并后翻转 |
| 42 | + # 将上述两个结果合并后翻转 |
41 | 43 | sum_left.extend(sum_end) |
42 | 44 | sum_left.reverse() |
43 | 45 |
|
44 | | - #取得各个和的个位的数字(如果进位则加上) |
| 46 | + # 取得各个和的个位的数字(如果进位则加上) |
45 | 47 | result = take_digit(sum_left) |
46 | | - |
47 | | - #翻转结果并合并为一个结果字符串数值 |
| 48 | + |
| 49 | + # 翻转结果并合并为一个结果字符串数值 |
48 | 50 | result.reverse() |
49 | 51 | int_result = "".join(result) |
50 | | - print "%d*%d="%(num1,num2) |
| 52 | + print "%d*%d=" % (num1, num2) |
51 | 53 | print int_result |
52 | 54 |
|
53 | 55 |
|
54 | | -#将int类型转化为str类型,9-->'09' |
| 56 | +# 将int类型转化为str类型,9-->'09' |
55 | 57 |
|
56 | 58 | def convert_to_str(num): |
57 | | - if num<10: |
58 | | - return "0"+str(num) |
| 59 | + if num < 10: |
| 60 | + return "0" + str(num) |
59 | 61 | else: |
60 | 62 | return str(num) |
61 | 63 |
|
62 | 64 |
|
63 | | -#计算阿拉伯乘法表格左侧开始的各项之和 |
| 65 | +# 计算阿拉伯乘法表格左侧开始的各项之和 |
64 | 66 |
|
65 | 67 | def summ_left(lst): |
66 | 68 | summ = [] |
67 | 69 | x = [i for i in range(len(lst))] |
68 | 70 | y = [j for j in range(len(lst[0]))] |
69 | | - sx = [i for i in x if i%2==0] |
| 71 | + sx = [i for i in x if i % 2 == 0] |
70 | 72 | for i in sx: |
71 | | - s=0 |
72 | | - j=0 |
73 | | - while i>=0 and j<=y[-1]: |
74 | | - s = s+ lst[i][j] |
75 | | - if i%2==1: |
76 | | - j = j+1 |
| 73 | + s = 0 |
| 74 | + j = 0 |
| 75 | + while i >= 0 and j <= y[-1]: |
| 76 | + s = s + lst[i][j] |
| 77 | + if i % 2 == 1: |
| 78 | + j = j + 1 |
77 | 79 | else: |
78 | 80 | j = j |
79 | | - i = i-1 |
| 81 | + i = i - 1 |
80 | 82 | summ.append(s) |
81 | 83 | return summ |
82 | 84 |
|
83 | 85 |
|
84 | | - |
85 | | -#计算阿拉伯乘法表格底部开始的各项之和 |
| 86 | +# 计算阿拉伯乘法表格底部开始的各项之和 |
86 | 87 |
|
87 | 88 | def summ_end(lst): |
88 | | - summ=[] |
| 89 | + summ = [] |
89 | 90 | y = [j for j in range(len(lst[0]))] |
90 | | - ex = len(lst)-1 |
| 91 | + ex = len(lst) - 1 |
91 | 92 | for m in range(len(y)): |
92 | 93 | s = 0 |
93 | | - i=ex |
94 | | - j=m |
95 | | - while i>=0 and j<=y[-1]: |
96 | | - s= s+lst[i][j] |
97 | | - if i%2==1: |
98 | | - j = j+1 |
| 94 | + i = ex |
| 95 | + j = m |
| 96 | + while i >= 0 and j <= y[-1]: |
| 97 | + s = s + lst[i][j] |
| 98 | + if i % 2 == 1: |
| 99 | + j = j + 1 |
99 | 100 | else: |
100 | | - j=j |
101 | | - i = i-1 |
| 101 | + j = j |
| 102 | + i = i - 1 |
102 | 103 | summ.append(s) |
103 | | - |
| 104 | + |
104 | 105 | return summ |
105 | 106 |
|
106 | | -#得到各个元素的个位数,如果是大于10则向下一个进位 |
| 107 | + |
| 108 | +# 得到各个元素的个位数,如果是大于10则向下一个进位 |
107 | 109 |
|
108 | 110 | def take_digit(lst): |
109 | 111 | tmp = 0 |
110 | 112 | digit_list = [] |
111 | 113 | for m in range(len(lst)): |
112 | 114 | lstm = 0 |
113 | | - lstm = lst[m]+tmp |
114 | | - if lstm<10: |
| 115 | + lstm = lst[m] + tmp |
| 116 | + if lstm < 10: |
115 | 117 | tmp = 0 |
116 | 118 | digit_list.append(str(lstm)) |
117 | 119 | else: |
118 | | - tmp = lstm/10 |
119 | | - mm = lstm-tmp*10 |
| 120 | + tmp = lstm / 10 |
| 121 | + mm = lstm - tmp * 10 |
120 | 122 | digit_list.append(str(mm)) |
121 | 123 | return digit_list |
122 | 124 |
|
123 | 125 |
|
124 | | -if __name__=="__main__": |
125 | | - arabic_multiplication(469,37) |
| 126 | +if __name__ == "__main__": |
| 127 | + arabic_multiplication(469, 37) |
0 commit comments