python长整数相乘_python实现大整数相乘---格子乘法
以前做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
python长整数相乘_python实现大整数相乘---格子乘法相关推荐
- python长整数相乘_python写的大整数相乘的方法
输入 72106547548473106236 982161082972751393 两个大整数 输出结果 70820244829634538040848656466105986748 解题思路 首先 ...
- 2018拼多多校招【大整数相乘】Python解法
思路 大整数相乘,其实完全套用了列竖式计算乘法的思路,重点就是讲竖式计算这一过程用代码表示.竖式计算中,一个乘数会和另一个乘数逐位相乘,从个位到最高位,相乘的结果依次左移一位,最后将多个计算结果相加即 ...
- 漫画:如何实现大整数相乘?(上)
戳蓝字"CSDN云计算"关注我们哦! 前一段时间,小灰发布了一篇有关大整数相加的漫画,没看过的小伙伴可以先看一看: 漫画:如何实现大整数相加? 那么,大整数相乘又是如何实现的呢? ...
- 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
- Cryp.1.大整数相乘---分治法
from:2017 CCF计算机课程改革导教班. 陈道蓄 11 大整数相乘 – 比长乘更快 小学里就教过整数乘的算法.要计算两个正整数a,b的乘积,你用b中每一位依次乘a,并将结果逐行排列,按b的相应 ...
- 大整数相乘java_大整数乘法—java实现
大整数相乘 参考博客: https://blog.csdn.net/oh_maxy/article/details/10903929 https://blog.csdn.net/u010867294/ ...
- 漫画:如何实现大整数相乘?(下)
戳蓝字"CSDN云计算"关注我们哦! 如何用程序实现大整数相乘呢? 在上一篇文章 漫画:如何实现大整数相乘?(上) 当中,我们介绍了两种思路: 1.像列竖式一样,把两整数按位依次 ...
- 拼多多2018校招内推编程-大整数相乘
编程题] 大整数相乘 时间限制:1秒 空间限制:32768K 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述: 空格分隔的两个字符串,代表 ...
最新文章
- java ror框架搭建_ROR 环境的 搭建
- c#实现分组服务器,单一无重复生成ID
- SAP UI5 Nav container - how the inner control is added
- 从抵触到力推,.Net Core的成功让微软正视开源
- s905各种型号的区别_梯式桥架和槽式桥架的区别介绍
- Windows平台下go编译器LiteIDE的安装和使用
- CvMat与LIplmage之间的相互转换__cvConvert()
- .net core json 为null输出_SpringBoot实战(九):标准化json返回值
- HDU 4704 Sum (费马小定理)
- 一个init.php(网站启始)的一般信息
- 为什么爬虫都用python_python为什么叫网络爬虫
- Word,Excel联动结合邮件合并功能实现批量打印员工个人信息表桌牌奖状出试卷
- 9个实用的,可以写进简历的数据分析项目!
- 消费心理学(02):沉没成本
- 申请 app store 退款
- 用python编写猜拳游戏
- [软考]项目目标VS项目基准
- 借助方便的工具平台,让App制作变简单
- Rasa课程、Rasa培训、Rasa面试系列之 Rasa幕后英雄系列-机器学习研究员 Johannes
- unity 所有版本下载地址