zoukankan      html  css  js  c++  java
  • 大数问题

    一、目录:

    二、题目1:两个大数相乘

    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

     输入描述:

      空格分隔的两个字符串,代表输入的两个大整数

     输出描述:

      输入的乘积,用字符串表示
      示例1
    输入
    72106547548473106236 982161082972751393

    输出
    70820244829634538040848656466105986748

    思路:https://blog.csdn.net/boguesfei/article/details/81368336

    计算的过程基本上和小学生列竖式做乘法相同。为编程方便,并不急于处理进位,而将进位问题留待最后统一处理。
    现以 835×49为例来说明程序的计算过程。
    先算835×9。5×9得到45个1,3×9得到27个10,8×9得到72个100。由于不急于处理进位,所以835×9算完后,aResult如下:
     
    接下来算4×5。此处4×5的结果代表20个10,因此要 aResult[1]+=20,变为:
     
     
    再下来算4×3。此处4×3的结果代表12个100,因此要 aResult[2]+= 12,变为:
     
    最后算 4×8。此处4×8的结果代表 32个1000,因此要 aResult[3]+= 32,变为:

     
    乘法过程完毕。接下来从 aResult[0]开始向高位逐位处理进位问题。aResult[0]留下5,把4加到aResult[1]上,aResult[1]变为51后,应留下1,把5加到aResult[2]上……最终使得aResult里的每个元素都是1位数,结果就算出来了:
     

    总结一个规律,即一个数的第i位和另一个数的第j位相乘所得的数,一定是要累加到结果的第i+j位上。这里i, j都是从右往左,从0开始数。
     

    代码:

    def largeIntMul(num1,num2):
        if not num1 or not num2:
            return -1
        m1 , m2 = len(num1) , len(num2)
        res , tmp = [0]* (m1+m2+1), [0] * (m1+m2)
        n1 = num1 if  m1 > m2 else num2
        n2 = num2 if n1 == num1 else num1
        for i in range(len(n2)):
            for j in range(len(n1)):
                tmp[j+i] += int(n2[i])*int(n1[j])
        a = 0
        for i,t in enumerate(tmp):
            b = (t + a) % 10
            a = (t + a) // 10
            res[i] = b
        res[i+1] = a
        res = list(map(str,res))
        res = ''.join(res[::-1])
        return res.lstrip('0')
    if __name__=='__main__':
        num1 , num2 = input().split()
        print(largeIntMul(num1[::-1],num2[::-1]))
     
     
  • 相关阅读:
    linux 声音大小调整的命令
    Linux下cron的使用
    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
    yii 删除内容时增加ajax提示
    git 忽略权限
    yii CGridView colum 链接
    yii cgridview 对生成的数据进行分页
    yii cgridview 默认的筛选如何做成选择框
    db2 Reorgchk:重组检查,是否需要重组
    Linux 下文件
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/10672261.html
Copyright © 2011-2022 走看看