Python实现高精度(一)加法计算

Python实现高精度(一)加法计算


题目来源:Central Europe 2000
题号:ZOJ1205

题目描述:十进制大数的加法运算

输入描述
Python实现高精度(一)加法计算输出描述
Python实现高精度(一)加法计算
Python实现高精度(一)加法计算
分析:

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()

分享就到这结束了,如果有什么问题,可以私信我,我们一起学习,我会尽量开始做好算法这一个专栏,在我学习的同时与大家分享我的学习心得。

上一篇:Spring源码学习(十八)---基于注解配置Aop的aspectj-autoproxy解析


下一篇:求解石子合并问题(选择dp循环的顺序)