以前做ACM的时候,许多人都通过 BigInteger 来实现大数乘法,让我记忆犹新的事2012年的辽宁省赛在大连大学,第一道水题就是大整数乘法,那时还不会java。 大数乘法的实现是基于印度的格子乘法,使用这种方法,计算 m 位数乘以 n 位数只需要创建一个 m+n 位的数组保存结果即可。
今天我们来用python来模拟一下格子算法的运算过程,python来写算法还是很简单的。
下面是从维基百科上爬下来的图片和详细步骤。
第一步:画带斜线的格子,将第一数(58)写在格子顶部,第二数(213)书写着格子的右侧如图,格子斜线下方写下乘积德个位数,格子斜线之上写入乘积的十位数。
第二步:将每个格子顶上数字与同一格子右边的数字相乘,将乘积逐个写入格子内,然后自下而上按斜线将数字相加,将所得的和写在格子图之下或左边:
第三步:从格子左边自上而下,接格子下边自左至右,读出乘积:12354
所以 58 x 213=12354
我算法的思路在下面的图片上,请各位大虾指正啊。。。。。算法注释明天再写吧,今天微微有些晚了。。。。。没想到居然一个小小算法写了两个小时。。。。。
# -*- coding:utf-8 -*- import pprint import sys def multiplication(num1,num2): num_list1 = [int(i) for i in str(num1)] num_list2 = [int(i) for i in str(num2)] int_martix = [[i*j for i in num_list1] for j in num_list2] #pprint.pprint(int_martix) result_martix = convert(int_martix) #pprint.pprint(result_martix) x_len = len(result_martix)-1 y_len = len(result_martix[0])-1 x=x_len y=y_len #print x,y result = str(result_martix[x][y]) #print result while(x != 0 and y != 0): jinwei_past = 0 for i in range(y): m = x n = y n = n-i-1 #print result_martix[m][n] temp = 0 while(m>=0 and n<=y_len): temp = temp + result_martix[m][n] m = m - 1 n = n + 1 #print temp jinwei_now = temp/10 num = int(temp%10+jinwei_past) if num>=10: jinwei_now = jinwei_now + 1 result = str(num%10) + result jinwei_past = jinwei_now #print result y = 0 for i in range(x+1): m = x n = 0 m = m-1-i temp = 0 while(m>=0 and n<=y_len): temp = temp + result_martix[m][n] m = m - 1 n = n + 1 jinwei_now = temp/10 num = int(temp%10+jinwei_past) if num>=10: jinwei_now = jinwei_now + 1 result = str(num%10) + result jinwei_past = jinwei_now x = 0 for i in range(len(result)): if result[i] != '0': result = result[i:] print result break def convert(martix): return_martix = [[(j[i]%10+j[i+1]/10) for i in range(0,len(j)-1)] for j in martix] i = 0 for j in martix: #print i,j return_martix[i].insert(0,j[0]/10) return_martix[i].append(j[len(j)-1]%10) i = i + 1 if i == len(martix): break return return_martix def main(): print "请输入两个整数:" num1,num2= map(int,sys.stdin.readline().split( )) multiplication(num1,num2) main()来自:http://blog.csdn.net/djd1234567
原文地址:http://blog.csdn.net/djd1234567/article/details/45649399