大数相加,相乘,幂运算

1.大数相加

思路:

两个数字转换为字符串,为了便于操作,分别逆转字符串,将短的字符串补上‘0’,使得长度相等。各个位分别相加,处理进位问题。最后再将结果倒置,从第一个不为0的字符开始输出

代码:

#reverse返回一个迭代器,用list()
s1=list(reversed(num1))
s2=list(reversed(num2))

if len(s1)>len(s2):
    for i in range(len(s1)-len(s2)):
        s2.append('0')
else:
    for i in range(len(s2)-len(s1)):
        s1.append('0')
print(s1,s2)
ans=[0]*(len(s1)+1)


for i in range(len(s1)):

    sum = int(s1[i]) + int(s2[i])+ans[i]
    if(sum>9):
        ans[i+1]=ans[i+1]+sum//10

    ans[i] = sum % 10

ans=list(reversed(ans))
print(ans)
i=0
flag=0
for i in range(len(ans)):
    if ans[i] != 0 and flag==0:
        break

    if ans[i]!=0:
        flag=1
    else:
        flag=0

while i<len(ans):
    print(ans[i],end='')
    i=i+1

2.大数相乘

思路:

与大数相加类似,模拟乘法,n位数*m位数,结果为n+m位数。先算出每一位的数,最后处理进位。

代码:

in1=input('').split(' ')
num1=in1[0];
num2=in1[1];
s1=list(reversed(num1))
s2=list(reversed(num2))

if len(s1)>len(s2):
    for i in range(len(s1)-len(s2)):
        s2.append('0')
else:
    for i in range(len(s2)-len(s1)):
        s1.append('0')
print(s1,s2)
ans=[0]*(max(len(s1),len(s2))*2)
for i in range(min(len(s1),len(s2))):
    for j in range(max(len(s1),len(s2))):
        if len(s1)>len(s2):
            ans[i+j]+=int(s1[j])*int(s2[i])
        else:
            ans[i+j]+=int(s1[i])*int(s2[j])
        #print(ans[i])
#print(ans)
for i in range(len(ans)):
    temp=ans[i]
    ans[i]=temp%10
    if temp>9:
        ans[i+1]+=temp//10

print(ans)
ans=list(reversed(ans))
print(ans)
i=0
flag=0
while 1:
    if ans[i]!=0 and flag==0:
        break
    i+=1
#print(i)
while i!=len(ans):
    print(ans[i],end='')
    i+=1

3幂运算

思路:n**k,n*n循环k次,转为乘法

for i in range(k-1):
    ans=bignumMul(ans,n)

猜你喜欢

转载自www.cnblogs.com/void-lambda/p/12309939.html