• 【Leetcode】【字符串相乘】


    43. 字符串相乘

     

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

    注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

    示例 1:

    输入: num1 = "2", num2 = "3"
    输出: "6"
    示例 2:

    输入: num1 = "123", num2 = "456"
    输出: "56088"

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/multiply-strings
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    对于字符串相乘,我们先需要定义字符串相加。 

    1. public:
    2. string addStrings(string num1, string num2) {
    3. //分别获取两个字符串的数组的最大下标
    4. int end1=num1.size()-1,end2=num2.size()-1;
    5. //用next来存储进位
    6. int next=0;
    7. //创建存储结果的字符串
    8. string strRet;
    9. //只要有一个字符串中还有数据就要继续循环
    10. while(end1>=0 || end2>=0)
    11. {
    12. //如果读取到的非空的话,就将字符串转换为数值
    13. int val1=end1>=0 ?num1[end1]-'0' :0;
    14. int val2=end2>=0 ?num2[end2]-'0' :0;
    15. int ret=val1+val2+next;
    16. //进位最多也只是9+9,最大也仅仅是1
    17. next=ret>9 ? 1:0;
    18. //可以采用insert指定在0号位置,插入一个元素,然后将我们计算过后的结果转换为字符串传入
    19. // strRet.insert(0,1,(ret%10)+‘0’);
    20. //或者是使用迭代器,将迭代器的开始位置传入,然后将我们计算过后的结果转换为字符串传入
    21. strRet.insert(strRet.begin(),'0'+(ret%10));
    22. //循环迭代
    23. --end1;
    24. --end2;
    25. }
    26. //处理1+9之类的情况,如果尾部为0,而十位上的读取都已经没有数据了,
    27. //但是还有进位的话就需要再头插1
    28. if(next)
    29. {
    30. strRet.insert(strRet.begin(),'1');
    31. }
    32. return strRet;
    33. }

     字符串相加还可以采用更加高效的尾插法

    1. public:
    2. string addStrings(string num1, string num2) {
    3. int end1=num1.size()-1,end2=num2.size()-1;
    4. int next=0;
    5. string strRet;
    6. while(end1>=0 || end2>=0)
    7. {
    8. int val1=end1>=0 ?num1[end1]-'0' :0;
    9. int val2=end2>=0 ?num2[end2]-'0' :0;
    10. int ret=val1+val2+next;
    11. next=ret>9 ? 1:0;
    12. //尾插
    13. strRet+=('0'+ ret%10);
    14. --end1;
    15. --end2;
    16. }
    17. //如果next还有进位就需要再尾插1
    18. if(next==1)
    19. {
    20. strRet+='1';
    21. }
    22. //逆置
    23. reverse(strRet.begin(),strRet.end());
    24. return strRet;
    25. }

     然后编写字符串相乘的函数。字符串相乘的函数需要调用我们字符串相加的函数。

    1. class Solution {
    2. public:
    3. string multiply(string num1, string num2) {
    4. //如果两个数都是0就直接返回
    5. if (num1 == "0" || num2 == "0") {
    6. return "0";
    7. }
    8. //ans中存储着我们的结果
    9. string ans = "0";
    10. int m = num1.size(), n = num2.size();
    11. //从其中一个字符串的个位开始逐个向前遍历
    12. //这里需要注意的是字符串的个位是size()-1的位置,而不是0!!!!
    13. for (int i = n - 1; i >= 0; i--) {
    14. //创建临时字符串存储我们本次相加的结果
    15. string curr;
    16. //add是用来存储进位的
    17. int add = 0;
    18. //我们需要判断我们所取出的这个数的位数,然后尾插0来补足位数
    19. for (int j = n - 1; j > i; j--) {
    20. curr.push_back(0);
    21. }
    22. //注意在运算的时候需要-'0'
    23. int y = num2.at(i) - '0';
    24. //从个位到高位遍历另外一个字符串。
    25. for (int j = m - 1; j >= 0; j--) {
    26. int x = num1.at(j) - '0';
    27. //不要忘了加上进位
    28. int product = x * y + add;
    29. //这里我们采用的是尾插,不要忘了最后要把数据反转回来
    30. curr.push_back(product % 10);
    31. //计算出我们的进位
    32. add = product / 10;
    33. }
    34. //如果两个字符串都计算完了,但是还有进位的话,我们还需要将这个进位尾插到我们的结果字符串中
    35. while (add != 0) {
    36. curr.push_back(add % 10);
    37. add /= 10;
    38. }
    39. //由于我们采用的是尾插,也就是说高位被放在了后面,所以要反转
    40. reverse(curr.begin(), curr.end());
    41. for (auto &c : curr) {
    42. //不要忘了将插入的每一个字符都加上'0'
    43. c += '0';
    44. }
    45. //调用我们的字符串加法,将我们的本次计算出来的数据相加到最终的结果中
    46. ans = addStrings(ans, curr);
    47. }
    48. return ans;
    49. }
    50. public:
    51. string addStrings(string num1, string num2) {
    52. int end1=num1.size()-1,end2=num2.size()-1;
    53. int next=0;
    54. string strRet;
    55. while(end1>=0 || end2>=0)
    56. {
    57. int val1=end1>=0 ?num1[end1]-'0' :0;
    58. int val2=end2>=0 ?num2[end2]-'0' :0;
    59. int ret=val1+val2+next;
    60. next=ret>9 ? 1:0;
    61. //尾插
    62. strRet+=('0'+ ret%10);
    63. --end1;
    64. --end2;
    65. }
    66. //如果next还有进位就需要再尾插1
    67. if(next==1)
    68. {
    69. strRet+='1';
    70. }
    71. //逆置
    72. reverse(strRet.begin(),strRet.end());
    73. return strRet;
    74. }
    75. };

  • 相关阅读:
    开源AI搜索平台Search4All
    【MySQL】:约束全解析
    SpringBoot源码解析(十九)启动内置tomcat
    【备考网络工程师】如何备考2023年网络工程师之错题集篇(2)
    【C语言】basename函数
    AS86汇编语法
    天黑了、让我为你关窗帘吧
    惹恼开源社区!微软道歉:恢复 .NET SDK 热重载功能
    [Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件
    如何使用html、css制作一个期末作业网站【羽毛球体育运动主题html网页设计】
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/126325202