python长整数相乘_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

ax_temp=int(lista[x])

else:

ax_temp=0 #千万别超出索引范围

if x

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值