处理 麻烦的,上百位的 数字的 加减乘除。啊啊啊!

水一水博客,向往更好的未来。

再很多编程的题里。。。。

有一些可恶的出题人,他们把测试点出的很大很大,more and more bigeeeeeeeeee......st

为了得到好看的成绩和不歇菜,我们不得不用编程的方式来打开小学的竖式。。。

加法 

(万数由加而生)

由于列表(数组)的读取是从左往右的,跟加法的从右往左刚好相反了,so,反转一下就行了。

a=input().strip()
b=input().strip()
#要相加的数
n=len(a)
m=len(b)
#找长度
anum=[int(i) for i in a]
bnum=[int(i) for i in b]
#变成[1,2,3]
anum.reverse()
bnum.reverse()
#变成[3,2,1]反转
if n>m:
     for i in range(n-m):
         bnum.append(0)
else:
    for i in range(m-n):
         anum.append(0)
#把[1,2,3],[4,5]变成[1,2,3],[0,4,5]防止错位
data=[0 for i in range(max(n,m)+1)]
#输出列表
for i in range(max(n,m)):
    data[i + 1] = (anum[i] + bnum[i] + data[i]) // 10
    #进位
    data[i]=(anum[i]+bnum[i]+data[i])%10
    #剩下的留下
data.reverse()
#反转回来
start=max(n,m)
for i in range(max(n,m)):
        if data[i]!=0:
                start=i
                break
for i in range(start,max(n,m)+1):
        print(data[i],end="")
#去剩下的零,输出

减法

(有加必有减)
a=input().strip()
b=input().strip()
#输入
final=''
if int(a)<int(b):
    a,b=b,a
    final+='-'
#负数?
n=len(a)
m=len(b)
#长度
anum=[int(i) for i in a]
bnum=[int(i) for i in b]
anum.reverse()
bnum.reverse()
if n>m:
    for i in range(n-m):
        bnum.append(0)
else:
    for i in range(m-n):
        anum.append(0)
#(看加法)
ans=[0 for i in range(max(n,m))]
#变成ans了
for i in range(max(n,m)):
    ans[i]=anum[i]-bnum[i]
#先减出来
for i in range(max(n,m)-1):
    if ans[i]<0:
        ans[i]+=10
        ans[i+1]-=1
#延时借位
ans.reverse()
#反转回来
num=''
for i in ans:
    num+=str(i)
num=num.lstrip('0')
if a==b:
    print(0)
else:
    print(final+num)
#去除零,输出

乘法

(便利的加法)
a=input().strip()
b=input().strip()
n=len(a)
m=len(b)
anum=[int(i) for i in a]
bnum=[int(i) for i in b]
anum.reverse()
bnum.reverse()
ans=[0 for i in range(n+m)]
#看减法
for i in range(m):
    for j in range(n):
        ans[i+j]+=bnum[i]*anum[j]
#乘一下
for i in range(n+m-1):
    ans[i+1]+=ans[i]//10
    ans[i]=ans[i]%10
#延迟进位
ans.reverse()
#反转
start=n+m-1
for i in range(n+m):
    if ans[i]!=0:
        start=i
        break
for i in range(start,n+m):
    print(ans[i],end="")
#去零,输出

除法

(有乘必有除)

终于,终于,不用反转啦!

n1=input().strip()
n2=int(input().strip())
#输入
l=len(n1)
#弄长度
last=0
#剩余
ans=[0 for i in range(l)]
#一如既往
for i in range(l):
    last=last*10
    last+=int(n1[i])
    #除的内容
    ans[i]=last//n2
    last=last%n2
    #除一下
idx=0
while idx<l-1 and ans[idx]==0:
    idx+=1
for i in range(idx,l):
    print(ans[i],end='')
#去零,输出

求过!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值