python里大整数相乘相关技巧指南


Posted in Python onSeptember 12, 2014

问题

大整数相乘

思路说明

对于大整数计算,一般都要用某种方法转化,否则会溢出。但是python无此担忧了。

Python支持“无限精度”的整数,一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型。

例如:

>>> 2899887676637907866*1788778992788348277389943

5187258157415700236034169791337062588991638L

注意:前面的“无限精度”是有引号的。事实上也是有限制的,对于32位的机器,其上限是:2^32-1。真的足够大了。

为什么Python能够做到呢?请有兴趣刨根问底的去看Python的有关源码。本文不赘述。

在其它语言中,通常用“分治法”解决大整数相乘问题。

但是,这里提供一个非常有意思的计算两个整数相乘的方法,算是做为大整数相乘的演示。

两个整数相乘:阿拉伯乘法。关于这个乘法的详细描述,请看:http://ualr.edu/lasmoller/medievalmult.html

解决(Python)

#!/usr/bin/env python
#coding:utf-8

#阿拉伯乘法
def arabic_multiplication(num1,num2):
  num_lst1 = [int(i) for i in str(num1)] #将int类型的123,转化为list类型的[1,2,3],每个元素都是int类型
  num_lst2 = [int(i) for i in str(num2)]

  #两个list中整数两两相乘
  int_martix = [[i*j for i in num_lst1] for j in num_lst2]

  #将上述元素为数字的list转化为元素类型是str,主要是将9-->'09'
  str_martix = [map(convert_to_str,int_martix[i]) for i in range(len(int_martix))]

  #将上述各个list中的两位数字分开:['01','29','03']-->[0,2,0],[1,9,3]
  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)]

  #计算阿拉伯乘法表的左侧开始各项和
  sum_left = summ_left(martix)

  #计算阿拉伯乘法表的底部开始各项和
  sum_end = summ_end(martix)

  #将上述两个结果合并后翻转
  sum_left.extend(sum_end)
  sum_left.reverse()

  #取得各个和的个位的数字(如果进位则加上)
  result = take_digit(sum_left)

  #翻转结果并合并为一个结果字符串数值
  result.reverse()
  int_result = "".join(result)
  print "%d*%d="%(num1,num2)
  print int_result

#将int类型转化为str类型,9-->'09'

def convert_to_str(num):
  if num<10:
    return "0"+str(num)
  else:
    return str(num)

#计算阿拉伯乘法表格左侧开始的各项之和

def summ_left(lst):
  summ = []
  x = [i for i in range(len(lst))]
  y = [j for j in range(len(lst[0]))]
  sx = [i for i in x if i%2==0]
  for i in sx:
    s=0
    j=0
    while i>=0 and j<=y[-1]:
      s = s+ lst[i][j]
      if i%2==1:
        j = j+1
      else:
        j = j
      i = i-1
    summ.append(s)
  return summ

#计算阿拉伯乘法表格底部开始的各项之和

def summ_end(lst):
  summ=[]
  y = [j for j in range(len(lst[0]))]
  ex = len(lst)-1
  for m in range(len(y)):
    s = 0
    i=ex
    j=m
    while i>=0 and j<=y[-1]:
      s= s+lst[i][j]
      if i%2==1:
        j = j+1
      else:
        j=j
      i = i-1
    summ.append(s)

  return summ

#得到各个元素的个位数,如果是大于10则向下一个进位

def take_digit(lst):
  tmp = 0
  digit_list = []
  for m in range(len(lst)):
    lstm = 0
    lstm = lst[m]+tmp
    if lstm<10:
      tmp = 0
      digit_list.append(str(lstm))
    else:
      tmp = lstm/10
      mm = lstm-tmp*10
      digit_list.append(str(mm))
  return digit_list

if __name__=="__main__":
  arabic_multiplication(469,37)
Python 相关文章推荐
Python修改Excel数据的实例代码
Nov 01 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
python中列表和元组的区别
Dec 18 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
Python中的defaultdict与__missing__()使用介绍
Feb 03 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
如何获取Python简单for循环索引
Nov 21 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
python里对list中的整数求平均并排序
Sep 12 #Python
python里将list中元素依次向前移动一位
Sep 12 #Python
python time模块用法实例详解
Sep 11 #Python
python+mysql实现简单的web程序
Sep 11 #Python
一个超级简单的python web程序
Sep 11 #Python
python的Template使用指南
Sep 11 #Python
Python基础之函数用法实例详解
Sep 10 #Python
You might like
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
Ajax 加载数据 练习代码
2017/01/05 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
JS实现打字游戏
2019/12/17 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
python验证码识别实例代码
2018/02/03 Python
python实现拓扑排序的基本教程
2018/03/11 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
如何在django中实现分页功能
2020/04/22 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
全球在线商店:BerryLook
2019/04/14 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
英文自荐信
2013/12/15 职场文书
项目开发计划书
2014/01/09 职场文书
担保书怎么写
2014/04/01 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书