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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
python实现爬虫下载漫画示例
Feb 16 Python
Python实现去除列表中重复元素的方法小结【4种方法】
Apr 27 Python
对python中的xlsxwriter库简单分析
May 04 Python
redis之django-redis的简单缓存使用
Jun 07 Python
Python使用matplotlib绘制随机漫步图
Aug 27 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
python3实现mysql导出excel的方法
Jul 31 Python
python如何查看安装了的模块
Jun 23 Python
Python中pass的作用与使用教程
Nov 13 Python
Python torch.flatten()函数案例详解
Aug 30 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
新手入门常用代码集锦
2007/01/11 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
Python版中国省市经纬度
2020/02/11 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
HTML5 Canvas概述
2009/08/26 HTML / CSS
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
语文教学随笔感言
2014/02/18 职场文书
售后服务承诺书模板
2014/05/21 职场文书
事业单位聘任报告
2015/03/02 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python