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刷投票的脚本实现代码
Nov 08 Python
Python的Django框架中TEMPLATES项的设置教程
May 29 Python
详解Python中的变量及其命名和打印
Mar 11 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
Python金融数据可视化汇总
Nov 17 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
浅谈Python中eval的强大与危害
Mar 13 Python
python实现在线翻译
Jun 18 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 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
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
如何理解python中数字列表
2020/05/29 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
python requests库的使用
2021/01/06 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
如何进行Linux分区优化
2013/02/12 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
商务主管岗位职责
2013/12/08 职场文书
后备干部培训方案
2014/05/22 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers