本文共 2370 字,大约阅读时间需要 7 分钟。
要实现一个字符串相加和字符串相乘的功能,这里将介绍两种常用的算法方案。以下内容将分为两部分:字符串加法和字符串乘法,每部分都将详细叙述实现方法和思路解析。
字符串加法
首先,讨论如何实现字符串的加法操作。假设给定的两个字符串分别为num1和num2,表示的非负整数需要进行相加。需要注意的是,字符串的长度不超过5100个字符,且字符串中不会包含前导零。具体实现思路如下:
初始化一个长度足够大的结果字符串sum,长度等于max(num1.size(), num2.size()) + 1。确保sum能够存储所有位数。
从字符串的末尾开始遍历,逐步将对应位置的数字相加。使用索引i遍历num1,索引j遍历num2,当前处理的位置为m = size -1。
每次取出num1[i]和num2[j]中的数字,将它们相加并加上可能的进位mod。然后根据总和的大小决定当前位的值以及进位情况:a. 如果总和小于等于9,则将该位设置为总和的值,进位置0。b. 如果总和大于等于10,则将该位设置为总和减去10,进位置1。
遍历完成后,如果还存在进位,则将其添加到结果的最高位。最后,去掉结果字符串前面的零,确保最终结果的正确性。
以下是一个具体的实现示例:
string addStrings(string num1, string num2) { int size = max(num1.size(), num2.size()) + 1; string sum(size, '0'); int i = num1.size() -1; int j = num2.size()-1; int m = size-1; int mod = 0; while (i >=0 || j >=0) { int a = (i >=0) ? (num1[i--] - '0') : 0; int b = (j >=0) ? (num2[j--] - '0') : 0; int total = a + b + mod; if (total <=9) { sum[m--] = total + '0'; mod = 0; } else { sum[m--] = (total -10) + '0'; mod =1; } } if (mod) { sum[m++] = '1'; } else { sum.erase(0, 1); } return sum;}
字符串乘法
接下来,我们将探讨如何实现字符串的乘法功能。给定的两个字符串num1和num2,它们表示的非负整数需要进行相乘。具体的实现思路如下:
创建一个与长度相关的数组比如nums,来记录每一位的乘积结果。数组的长度设置为num1.size() + num2.size(),初始值为0。
外层循环遍历num1中的每一位数字num1[i]。内层循环遍历num2中的每一位数字num2[j],计算这两个数字的乘积。将乘积结果加上从前一位循环中的进位mod,得到当前位的结果。然后将当前位的mod值作为下一位循环的进位。
如果当前bit的乘积和进位的总和为0,则直接将其置为0。
将计算完成后的数值写入对应的位置。
最后,确定nums数组中最小的位数部分,将其设置为结果字符串。
以下是具体实现代码示例:
string multiply(string num1, string num2) { int m = num1.size(); int n = num2.size(); vector nums(m + n, 0); for (int i = 0; i < m; ++i) { int mod = nums[i]; for (int j = 0; j < n; ++j) { int digit1 = (num1[m - i -1] - '0'); int digit2 = (num2[n -j -1] - '0'); int product = digit1 * digit2 + mod; nums[i +j] += product; nums[i +j] %= 10; mod = product / 10; } if (mod != 0) { nums[i + n] += mod; } } int size = nums.size(); string result(size, '0'); for (int i =0; i < m; ++i) { result[m + n -i -1] = nums[i] ==0 ? '0' : nums[i] + '0'; } return result;}
以上展示了字符串加法和乘法的两种实现方案。在代码的实现过程中,我们采用逐位操作的方法,尽量避免了使用内置的BigInteger库或者直接转换字符串为整数值。通过这种方式我们能够有效地处理大数运算,将结果正确地输出到字符串中。
转载地址:http://lkryk.baihongyu.com/