>  기사  >  백엔드 개발  >  파이썬에서 큰 정수를 곱하는 방법 안내

파이썬에서 큰 정수를 곱하는 방법 안내

高洛峰
高洛峰원래의
2017-03-11 10:29:103792검색

큰 정수 계산의 경우 일반적으로 어떤 방식으로든 변환해야 합니다. 그렇지 않으면 오버플로됩니다. 하지만 파이썬에는 그런 걱정이 없습니다. Python은 "무한 정밀도" 정수를 지원합니다. 일반적으로 정수 오버플로 문제를 고려할 필요가 없습니다. 또한 Python Int 유형과 임의 정밀도의 Long 정수 클래스는 Int 범위를 초과하는 모든 항목을 원활하게 변환할 수 있습니다. 롱타입으로.

문제

대형 정수의 곱셈

아이디어 설명

대형 정수 계산의 경우 일반적으로 어떤 변환 방법을 사용해야 합니다. 그렇지 않으면 넘칠 것이다. 하지만 파이썬에는 그런 걱정이 없습니다.

Python은 "무한 정밀도" 정수를 지원합니다. 또한, Python Int 유형과 모든 정밀도의 Long 정수 클래스는 정수 오버플로 문제를 고려할 필요가 없습니다. Int의 범위가 Long 유형으로 변환됩니다.

예:

>>> 2899887676637907866*1788778992788348277389943
5187258157415700236034169791337062588991638L


참고: 이전의 "무한 정밀도"는 따옴표 안에 있습니다. 실제로 32비트 시스템의 경우 상한은 2^32-1입니다. 정말 충분히 큽니다.

파이썬은 왜 할 수 있나요? Python의 근본 원인을 파악하는 데 관심이 있다면 관련 Python 소스 코드를 확인하세요. 이 기사에서는 자세히 다루지 않습니다.

다른 언어에서는 일반적으로 큰 정수 곱셈 문제를 해결하는 데 "분할 정복" 방법이 사용됩니다.

그러나 여기에 두 정수의 곱셈을 계산하는 매우 흥미로운 방법이 있는데, 이는 큰 정수의 곱셈을 시연하는 데 사용할 수 있습니다.

두 정수의 곱셈: 아랍어 곱셈. 이 곱셈에 대한 자세한 설명은 http://www.php.cn/

Solve(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)

를 참조하세요.

위 내용은 파이썬에서 큰 정수를 곱하는 방법 안내의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.