首页 > 其他分享 >实现两个字符串相乘

实现两个字符串相乘

时间:2024-04-01 21:02:11浏览次数:25  
标签:实现 str2 str1 single 相乘 num result str 字符串

‘’’
有两个字符串,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))

标签:实现,str2,str1,single,相乘,num,result,str,字符串
From: https://blog.csdn.net/qingcheng_123456/article/details/137246430

相关文章

  • 【异常】Spring的依赖注入(DI)系统提示异常,因为漏了一个实现类导致了错误Parameter 0 of
    一、异常内容2024-04-0111:44:39.912[main]ERRORorg.springframework.boot.diagnostics.LoggingFailureAnalysisReporter-***************************APPLICATIONFAILEDTOSTART***************************Description:Parameter0ofconstructorinc......
  • 亿级地址关联匹配如何实现每天全量更新?大数据环境下hive+addresstool解决方案
    在政务系统中有许多需要将业务地址关联到标准地址的场景,addresstool致力于解决地址关联匹配算法中的速度和准确性问题。最近遇到一个业务痛点,由于客户标准地址在持续更新,导致历史上业务地址关联到的标准地址无法与最新的标准地址挂接,于是客户要求每日对全量业务地址进行挂接标准......
  • Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)
    【写在前面】        之前应公司需要,给公司写过一整套直播的库(推拉流,编解码),类似于libobs。    结果后来因为没有相关项目,便停止开发&维护了。    不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。    因此,本篇就简单讲一下用......
  • 11种排序算法(Python实现)
    10种排序算法(Python实现)冒泡排序1、两重循环,每次都将一个点移动到最终位置defBubbleSort(lst):n=len(lst)ifn<=1:returnlstforiinrange(0,n):forjinrange(0,n-i-1):#每轮确定一个点的最终位置iflst[j]>lst[j+1]:......
  • 208. 实现 Trie (前缀树)
    classTrie{Trie[]chs=newTrie[26];intcnt=0;publicTrie(){}publicvoidinsert(Stringword){Trieroot=this;for(charch:word.toCharArray()){if(root.chs[ch-'a']==null){......
  • 【PyTorch 实战2:UNet 分类模型】10min揭秘 UNet 分割网络如何工作以及pytorch代码实现
    UNet网络详解及PyTorch实现一、UNet网络原理  U-Net,自2015年诞生以来,便以其卓越的性能在生物医学图像分割领域崭露头角。作为FCN的一种变体,U-Net凭借其Encoder-Decoder的精巧结构,不仅在医学图像分析中大放异彩,更在卫星图像分割、工业瑕疵检测等多个领域展现出强大的应用......
  • 云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
    方案概述现在绝大多数客户都有很多非结构化的数据存在OSS中,以图片,视频,音频居多。举一个图片处理的场景,现在各种终端种类繁多,不同的终端对图片的格式、分辨率要求也不同,所以一张图片往往会有很多张衍生图,那如果所有的衍生图都存在OSS中,那存储的成本会增加,所以就可以通过OSSO......
  • python计算机毕设【附源码】毕业生离校系统的设计与实现(django+mysql+论文)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的飞速发展,信息化管理已经成为了现代教育体系中不可或缺的一部分。对于高校而言,毕业生离校系统的设计与实现是提高学校管理效率、优化毕业生......
  • 数据分析(三)线性回归模型实现
    1.惩罚线性回归模型概述线性回归在实际应用时需要对普通最小二乘法进行一些修改。普通最小二乘法只在训练数据上最小化错误,难以顾及所有数据。惩罚线性回归方法是一族用于克服最小二乘法(OLS)过拟合问题的方法。岭回归是惩罚线性回归的一个特例。岭回归通过对回归系数的平方......
  • Windows下实现定时重启某软件或某服务
     ==========================================================================应用场景:服务器上部署的某后端软件需要定时重启或释放,保证程序的稳定运行和灵敏响应。实现方法如下:①编写一个批处理程序脚本,名字随意取,代码如下:@echooffping-n2127.1>nultaskkill......