实现两个字符串相乘

‘’’
有两个字符串,str1,str2,内容为数值,数值均大于0请编写算法计算两个字符串相乘的结 果,
不可以使用大数据类型,不可以把字符串直接转成整数来处理。
题目要求的很明确,不可以直接把字符串转成整数然后相乘,所以int(str1)*int(str2)是不被允 许的。

不止如此,第三个示例里,数值已经非常大,已经超出了264 ,在计算过程中,中间结果也非 常的大,
在大多数编程语言里,你找不到合适的数据类型来存储这样的数据,因此,只能用字 符串来保存。

先来看第一个示例, 3 乘 5, 简单的乘法,在看第二个示例, 32 乘 15 ,小学的时候都学 过如何计算乘法,
325 + 3210 =480。需要编写一个算法,来实现这个计算过程,但是要 注意,
325的结果必须保存成为字符串写160写,为什么不能保存成数值型数据160呢?
就32
15 来说,保存成数值是没有问题的,可对于第三个示例,在计算中间结果时,
得到的结果太大 了,根本无法用数值型变量保存,因此必须保存成字符串。

‘’’

我们需要先实现—个简单的字符串乘法,函数定义为

def single_str_multi(str1, single):
   """
   single是一个小于10的数值,例如 323354 * 4
   :param str1: 基础数值
   :param single: 单个数值
   :return: 乘积的字符串表示
   """
   # 进位
   pre_num = 0
   result = []  # 用来保留结果
   n = len(str1) - 1
   while n >= 0:
      # 计算当前位的结果
      current_num = int(str1[n]) * single + pre_num
      pre_num = current_num // 10
      current_num = current_num % 10
      result.insert(0, str(current_num))
      n -= 1
   
   # 处理最高位的进位
   if pre_num > 0:
      result.insert(0, str(pre_num))
   
   return ''.join(result)

有了上面的基础 就可以实现两个字符串相乘了

‘’’
这—次,反向遍历str2,每次遍历都得到—个单—数值single,这样恰好可以调用
single-str-multi 函数,但是需要注意的是每次得到的结果都要根据single的位置补0,
如果 single是str2的百位,那么计算结果就要乘100。

‘’’
‘’’
字符串相加

每次调用single-str-multi函数,得到的都是中间结果,这些结果必须加在—起才能得到乘法 的结果,
因此,我们还需要—个计算字符串加法的函数,
函数定义如下:
‘’’

def add_str(str1, str2):
   """
   :param str1: 基础数值
   :param str2: 单个数值
   :return:
   """
   # 进位
   pre_num = 0
   result = []  # 用来保留结果
   # 进行补位
   str1 = str1.zfill(len(str2))
   str2 = str2.zfill(len(str1))
   n = len(str1) - 1
   while n >= 0:
      # 计算当前位的结果
      current_num = int(str1[n]) + int(str2[n]) + pre_num
      pre_num = current_num // 10  # 进位
      current_num = current_num % 10
      result.insert(0, str(current_num))
      n -= 1
   
   # 处理最高位的进位
   if pre_num > 0:
      result.insert(0, str(pre_num))
   
   return ''.join(result)

有了上面的基础 就可以实现两个字符串相乘

def multi_str(str1, str2):
   """
   :param str1: 基础数值
   :param str2: 单个数值
   :return:
   """
   # 反向遍历str2,每次遍历都得到—个单—数值single,这样恰好可以调用
   # single-str-multi 函数,但是需要注意的是每次得到的结果都要根据single的位置补0,
   # 如果    single是str2的百位,那么计算结果就要乘100。
   result = '0'
   for index,item in enumerate(reversed(str2)):
      #如果当前位是0 那么直接跳过
      if item == '0':
         continue
      # 调用single-str-multi函数,得到中间结果
      single_result = single_str_multi(str1, int(item))
      #一定要进行补0操作
      if single_result!='0':
         single_result+='0'*index
      #调用add_str函数,得到最终结果
      result = add_str(result, single_result)
   return result


if __name__ == '__main__':
   str1 = '15'
   str2 = '60'
   print(multi_str(str1, str2))
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值