python实现大整数相乘-网格乘法

python实现大整数相乘---格子乘法

        以前做ACM的时候,许多人都通过 BigInteger 来实现大数乘法,让我记忆犹新的事2012年的辽宁省赛在大连大学,第一道水题就是大整数乘法,那时还不会java。 大数乘法的实现是基于印度的格子乘法,使用这种方法,计算 m 位数乘以 n 位数只需要创建一个 m+n 位的数组保存结果即可。

今天我们来用python来模拟一下格子算法的运算过程,python来写算法还是很简单的。

下面是从*上爬下来的图片和详细步骤。

第一步:画带斜线的格子,将第一数(58)写在格子顶部,第二数(213)书写着格子的右侧如图,格子斜线下方写下乘积德个位数,格子斜线之上写入乘积的十位数。
python实现大整数相乘-网格乘法
第二步:将每个格子顶上数字与同一格子右边的数字相乘,将乘积逐个写入格子内,然后自下而上按斜线将数字相加,将所得的和写在格子图之下或左边:
python实现大整数相乘-网格乘法
第三步:从格子左边自上而下,接格子下边自左至右,读出乘积:12354
python实现大整数相乘-网格乘法
所以 58 x 213=12354

算法的思路在下面的图片上,请各位大虾指正啊。。。。。算法注释明天再写吧,今天微微有些晚了。。。。。没想到居然一个小小算法写了两个小时。。。。。

python实现大整数相乘-网格乘法

# -*- 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