python内置了大数运算,非常方便,这是个模拟竖式乘法的小程序,可以计算任意位数乘法.
运行结果如下:
结果及时间:
1234567009
* 12345678900987654321
------------------------------
1234567009
2469134018
3703701027
4938268036
6172835045
7407402054
8641969063
9876536072
11111103081
11111103081
9876536072
8641969063
7407402054
6172835045
4938268036
3703701027
2469134018
1234567009
------------------------------
15241567874866735541002895889
12345678900987654321
* 1234567009
------------------------------
111111110108888888889
86419752306913580247
74074073405925925926
61728394504938271605
49382715603950617284
37037036702962962963
24691357801975308642
12345678900987654321
------------------------------
15241567874866735541002895889
[Finished in 0.2s] 代码如下:
#! /urs/bin/env python
# big intiger multiplication
def bigmul(a,b):
sa = str(a)
sb = str(b)
resultline = ' '*(len(sa)+len(sb)) # len(a)+len(b) spaces
# a
# * b
print
print resultline[:-len(sa)]+sa
print '*'+resultline[:-len(sb)-1]+sb
# ---
print '-'*(len(sa)+len(sb))
# ###
# ###
# ###
result_list = [] # result list, [b_i*a]
cursp = 0 # spaces need to be added to the end, result shift postion
for db in sb[::-1]:
if int(db)==0: # b_i==0, result shift to right 1 postion
cursp += 1
continue
else:
result = '' # empty current result
carrier = 0 # carrier from previous calculation
for da in sa[::-1]: # b_i*a_i
mr = int(db)*int(da)+carrier # result = b_i*a_i+carrier
carrier = mr/10 # carrier = result /10
result += str(mr%10) # add last digit to the result
if carrier!=0: # process last carrier
result += str(carrier)
result = result[::-1]+' '*cursp # reverse result string, add shift postion to the end
cursp += 1 # add shift postion
result_list.append(resultline[:-len(result)]+result) # append b_i*a to the result list
print resultline[:-len(result)]+result # print current result
# ----
print '-'*(len(sa)+len(sb))
# result
print resultline[:-len(str(sum([int(x.replace(' ','0')) for x in result_list])))]+str(sum([int(x.replace(' ','0')) for x in result_list]))
# unit test
def main():
a = 12345678900987654321
b = 1234567009
bigmul(b,a)
bigmul(a,b)
if __name__=='__main__':
main()
No comments :
Post a Comment