Python实现高精度(一)加法计算
题目来源:Central Europe 2000
题号:ZOJ1205
题目描述:十进制大数的加法运算
输入描述
输出描述
分析:
1、首先是我们要接收一共要判断多少数组
这里就是我们传统定义的第一种输入方式,就直接输入
n=int(input()) # 表示有n组输入数据
2、处理一组数
2.1 首先是存储输入的数字
在题目中提到,整数的长度不会大于100,所以我们在这里可以用 int或者str 存储每一位数,因为数字的长度不固定,所以我们应该建立一个列表长度为100的,保证能够存储,并且为了后面的计算方便,我们应该逆序存储,如果正序存储,不方便计算,而且很容易计算错位。所以第一位就应该是表示的个位数(我这里用int类型存储我们的值)
代码如下
x = []
maxlen = -1
for n in range(100):
Num = input()
if (Num == "0"):
break
x.append([0 for i in range(100)]) # 增加一个存储位置
lens = len(Num)
# 获取最长的字符串的长度
if lens > maxlen:
maxlen = lens
# 逆序存储数字
for S in range(lens):
x[n][S] = int(Num[lens - 1 - S])
2.2 进行计算
计算所有的数字,注意,为了保障能够计算不缺失,需要在最长数字的长度上,多计算两个位置
1、命名进位数,然后将sum的值计算每一位的值,其中一定要加上进位数
2、然后进位数为 sum除以10的值,余数为当前位的值
代码如下:
carry = 0 # 表示进位的值
for i in range(maxlen + 2):
sum = carry
for j in range(n):
sum += x[j][i]
digit = sum % 10
carry = sum // 10
result[i] = digit
2.3 输出
输出长度,需要注意的是,在这里我们应该去确定,我们的结果中,逆序第一个不为0的值开始, 所以需要从result的maxlen+2,中去判断,是否为0,找到第一个不为0的,然后记住这个位置, 然后从这个位置开始输出
代码如下:
i = maxlen + 2
while (i >= 0):
if result[i] != 0:
break
i -= 1
while (i >= 0):
print(result[i], end='')
i -= 1
print()
3.处理全部的数组
因为题目中提到了,我们在两个数组之间的输出需要用空行隔开,所以我们在用判断,是否需要输入。
4 完整代码
class solution:
def Integer_solver(self):
x = []
sum = 0
maxlen = -1
result = [0 for i in range(110)]
# 1、接收输入值:
for n in range(100):
Num = input()
if (Num == "0"):
break
x.append([0 for i in range(110)]) # 增加一个存储位置
lens = len(Num)
# 获取最长的字符串的长度
if lens > maxlen:
maxlen = lens
# 逆序存储数字
for S in range(lens):
x[n][S] = int(Num[lens - 1 - S])
carry = 0 # 表示进位的值
for i in range(maxlen + 2):
sum = carry
for j in range(n):
sum += x[j][i]
digit = sum % 10
carry = sum // 10
result[i] = digit
i = maxlen + 2
while (i >= 0):
if result[i] != 0:
break
i -= 1
while (i >= 0):
print(result[i], end='')
i -= 1
print()
def Integer(self):
"""
输入文件的第1行为一个整数N,表示输入文件中接下来有N组数据。
每组数据最多包含100行。每一行由一个非常长的十进制整数组成,
这个整数的长度不会超过100个字符而且只包含数字,每组数据的最后一行为0,
表示这组数据结束。每组数据之间有一个空行。
:return:
"""
n=int(input()) # 表示有n组输入数据
for i in range(n):
self.Integer_solver()
if(i<n):
print("\n")
if __name__=="__main__":
A=solution()
A.Integer()
分享就到这结束了,如果有什么问题,可以私信我,我们一起学习,我会尽量开始做好算法这一个专栏,在我学习的同时与大家分享我的学习心得。