python写的大整数相乘的方法

输入

72106547548473106236 982161082972751393  两个大整数

输出结果

70820244829634538040848656466105986748

解题思路

首先根据 大整数相乘的原理的基础上,把大整数进行优化拆分,拆分的长度,要考虑语言中整形的长度。这里用的python,其实可以直接乘的,呵呵。我暂定设为了 4,也就是 说
7210 6547 5484 7310 6236
98 2161 0829 7275 1393
然后 逐份相乘,当然千万别忘了结果要补零。 例如  当 7310 * 7275 结果一定要补上8个零。

最后 将每一步的结果直接相加就可以了。里面写了一个函数 xiangjia,就是用于大整数相加的。没做优化,其实也是可以每隔几位 ,分割开的。


# hh=input()
hh=‘72106547548473106236 982161082972751393‘
zonglen=len(hh)-1
a=hh.split()

tiqu=4  #提取位数,大小取决于内存中 int型位数,我这里随便写的。因为python,其实没有限制。
#大整数相加的函数,没做优化 没做分割
def xiangjia(a1,b1):
    lista=list(a1[::-1])   #翻转
    listb=list(b1[::-1])

    list_resu=[]
    yu9=0
    resu9=0
    for x in range(max(len(a1),len(b1))):  #取最长的数,循环

        if x<len(a1):
            ax_temp=int(lista[x])
        else:
            ax_temp=0   #千万别超出索引范围

        if x<len(b1):
            bx_temp=int(listb[x])
        else:
            bx_temp=0     

        resu9=(ax_temp+bx_temp+yu9)%10    #进位
        yu9=(ax_temp+bx_temp+yu9)//10     #余数
        list_resu.append(resu9)

    if yu9>0:
        list_resu.append(yu9)  #循环完了后,如果还有余数,继续添加

    #转化成正常序列
    resu8=‘‘
    for x in list_resu[::-1]:
        resu8+=str(x)

    return resu8

#创建空list_sum
result0=‘‘

#开始遍历

#取长度
a0_len=len(a[0])
a1_len=len(a[1])

#取除结果
chu0=a0_len//tiqu
chu1=a1_len//tiqu

#取余
yu0=a0_len%tiqu
yu1=a1_len%tiqu 

x=0
y=0
while chu1-y>=0:
    x=0
    while chu0-x>=0:

        if chu0-x>0:
            cheng0=int(a[0][-(1+x*tiqu):-(tiqu+1+x*tiqu):-1][::-1])
        else:
            if yu0>0:
                cheng0=int(a[0][0:yu0])
            else:
                break            

        if chu1-y>0:
            cheng1=int(a[1][-(1+y*tiqu):-(tiqu+1+y*tiqu):-1][::-1])
        else:
            if yu1>0:
                cheng1=int(a[1][0:yu1])
            else:
                break           

        temp_resu=str(cheng0*cheng1)+‘0‘*x*tiqu+‘0‘*y*tiqu
        result0=xiangjia(result0,temp_resu)

        x+=1
    y+=1   

print(result0)

这是优化前的一版,完全按照手工计算的竖式方式编的,仅供参考。

hh=input()
zonglen=len(hh)-1
a=hh.split()

#创建空list_sum
list_sum=[]
for x in range(zonglen-1):
    list_sum.append(0)

p=0  #空位
for x in a[1][::-1]:  #遍历第二个大数   翻转遍历
    list0=[]
    for y in a[0][::-1]: #遍历第一个大数    翻转遍历
        list0.insert(0,int(x)*int(y))

    #移位相加
    n=len(list0)
    for g in range(n):
        list_sum[zonglen-1-g-1-p]+=list0[n-g-1]

    p+=1

#求和
m=0  #进位数
n=len(list_sum)

for z in range(n):   #进位
    list_sum[n-z-1]+=m
    m=0
    if list_sum[n-z-1]>=10:
        m=list_sum[n-z-1]//10
        list_sum[n-z-1]=list_sum[n-z-1]%10

if m>0:    #高位补数 进位
    list_sum.insert(0,m)

#转字符串输出
result=‘‘
for x in list_sum:
    result+=str(x)    

print(result)

  

原文地址:https://www.cnblogs.com/duoba/p/12241839.html

时间: 2024-10-12 17:17:30

python写的大整数相乘的方法的相关文章

用阿拉伯乘法解决大整数相乘问题

问题 大整数相乘 思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持"无限精度"的整数,一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 5187258157415700236034169791337062

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

自己动手写Java大整数《3》除法和十进制转换

之前已经完成了大整数的表示.绝对值的比较大小.取负值.加减法运算以及乘法运算.具体见前两篇博客(自己动手写Java * ). 这里添加除法运算. 另外看到作者Pauls Gedanken在blog(http://paul-ebermann.tumblr.com/post/6312290327/big-numbers-selfmade-part-2-14-conversion-from)中的转换十进制数到大整数的方法,这里一并列出. 除法 除法使用经典的除法法则,但是有几个需要注意的问题,下面列出

Python写各大聊天系统的屏蔽脏话功能原理

Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时候检测,那么个人还是喜欢用列表,因为列表灵活使用扩展都很方便,有了脏话库我们在来想核心怎么屏蔽脏话,你要记得玩家输入的弹幕数据类型是什么首档其次是字符串如果没有特殊要求就它了,万变不离其中总是这几个数据结构嘛,有了字符串替换*号什么的都轻松许多了对吧,今天所聊的是完整的一套结构,为了让大家更清晰学会

自己动手写Java大整数《4》扩展欧几里得和Mod逆

/* *我把这个大整数的系列写成了Code中的项目,见https://code.csdn.net/XUE_HAIyang/bignumber */ 之前已经完成了大整数的表示.绝对值的比较大小.取负值.加减法运算.乘法运算以及除法和余数运算.具体见我的主页前三篇博客(自己动手写Java系列 ). 这篇博客添加求大整数GCD.扩展欧几里得算法和求Mod逆的算法. 扩展欧几里得算法 说道扩展的欧几里得算法,首先我们看下简单的欧几里得算法.经典的欧几里得算法就是 计算两个整数的最大公因子的算法,所基于

python实现大整数相乘---格子乘法

以前做ACM的时候,许多人都通过 BigInteger 来实现大数乘法,让我记忆犹新的事2012年的辽宁省赛在大连大学,第一道水题就是大整数乘法,那时还不会java. 大数乘法的实现是基于印度的格子乘法,使用这种方法,计算 m 位数乘以 n 位数只需要创建一个 m+n 位的数组保存结果即可. 今天我们来用python来模拟一下格子算法的运算过程,python来写算法还是很简单的. 下面是从维基百科上爬下来的图片和详细步骤. 第一步:画带斜线的格子,将第一数(58)写在格子顶部,第二数(213)书

链表问题3——大整数相乘

Description 求两个不超过200位的非负整数的积. 解决方法:先考虑大整数存储结构,数组和链表都可以,因为数组使用不熟练,我先考虑链表,做了6小时才写好...也是醉了.下面简单介绍我的思路: 1.考虑链表的数据结构:先思考得知,链表结点要有pre.next指针,所以是双向链表,要设置头尾节点,我是让尾结点指向最后一个结点,头节点为虚结点. 2.链表构造问题:从输入的字符串转换为整型的链表 3.相乘:为了错位相加中运算方便,我将结果倒序表示,头节点后面连结果的最后一位数.一开始结果链表r

整数平方根:整数开方及大整数开方解决方法

求整数N的开方,精度在0.001 二分法 若N大于1,则从[1, N]开始,low = 1, high = N, mid = low + (high - low) >> 1开始进行数值逼近 若N小于1,则从[N, 1]开始,low = 0, high = N, mid = low + (high - low) >> 1开始进行数值逼近 #include <stdio.h> #include <stdlib.h> #include <math.h>