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中的25个隐藏特性
Mar 30 Python
详细讲解Python中的文件I/O操作
May 24 Python
python中实现精确的浮点数运算详解
Nov 02 Python
python让列表倒序输出的实例
Jun 25 Python
用Python shell简化开发
Aug 08 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
Python读写文件基础知识点
Jun 10 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
Python定义一个函数的方法
Jun 15 Python
python 提高开发效率的5个小技巧
Oct 19 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
用php将任何格式视频转为flv的代码
2009/09/03 PHP
PHP学习笔记之二
2011/01/17 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
浅析PHP Socket技术
2013/08/02 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
python实现壁纸批量下载代码实例
2018/01/25 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
如何通过jdbc调用存储过程
2012/04/19 面试题
Java面向对象面试题
2016/12/26 面试题
社保缴纳证明申请书
2014/11/03 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers