ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-17 12:30:57  阅读:237  来源: 互联网

标签:高精度 Python sum lens maxlen range Num result 加法


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

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

标签:高精度,Python,sum,lens,maxlen,range,Num,result,加法
来源: https://blog.csdn.net/m0_46230270/article/details/121374568

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有