‘’’
有两个字符串,str1,str2,内容为数值,数值均大于0请编写算法计算两个字符串相乘的结 果,
不可以使用大数据类型,不可以把字符串直接转成整数来处理。
题目要求的很明确,不可以直接把字符串转成整数然后相乘,所以int(str1)*int(str2)是不被允 许的。
不止如此,第三个示例里,数值已经非常大,已经超出了264 ,在计算过程中,中间结果也非 常的大,
在大多数编程语言里,你找不到合适的数据类型来存储这样的数据,因此,只能用字 符串来保存。
先来看第一个示例, 3 乘 5, 简单的乘法,在看第二个示例, 32 乘 15 ,小学的时候都学 过如何计算乘法,
325 + 3210 =480。需要编写一个算法,来实现这个计算过程,但是要 注意,
325的结果必须保存成为字符串写160写,为什么不能保存成数值型数据160呢?
就3215 来说,保存成数值是没有问题的,可对于第三个示例,在计算中间结果时,
得到的结果太大 了,根本无法用数值型变量保存,因此必须保存成字符串。
‘’’
我们需要先实现—个简单的字符串乘法,函数定义为
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