题目之大数运算

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目之大数运算相关的知识,希望对你有一定的参考价值。

题目链接
题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。


思路

  1. 创建一个进位位,从两个字符串尾部开始遍历
  2. 只要有一个字符串不小于0或进位位不等于0,进行-‘0’记录此个位数字,然后三数相加(进位,num1,num2)
  3. 大于10就把进位位置为sum/10,再往复循环

代码如下:

class Solution {
public:
   string addStrings(string num1, string num2) {
       string s1;
       int add=0,size1=num1.length()-1,size2=num2.length()-1;
       while(size1>=0||size2>=0||add!=0)
       {
           int x=size1>=0?num1[size1]-'0':0;
           int y=size2>=0?num2[size2]-'0':0;
           int sum=x+y+add;
           s1.push_back('0'+sum%10);
           add=sum/10;
           size1--;
           size2--;
       }
       reverse(s1.begin(),s1.end());
       return s1;
   }
};

注意:在c++中insert非常不推荐使用,在这里反转字符串的时候用insert会把时间复杂度提到O(n^2)

题目链接

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


思路一 时间复杂度:O(mn+n^2) m,n两字符串的长度,空间复杂度:O(m+n))

  1. 做加法,以num2为乘数便利每一位,以乘法处理方式(注意加0问题)
  2. 每一次乘出的值用加法逻辑相加

代码如下:

class Solution {
public:
    string addStrings(string num1, string num2) {
        string s1;
        int add=0,size1=num1.length()-1,size2=num2.length()-1;
        while(size1>=0||size2>=0||add!=0)
        {
            int x=size1>=0?num1[size1]-'0':0;
            int y=size2>=0?num2[size2]-'0':0;
            int sum=x+y+add;
            s1.push_back('0'+sum%10);
            add=sum/10;
            size1--;
            size2--;
        }
        reverse(s1.begin(),s1.end());
        return s1;
    }
    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
        {
            return "0";
        }
        else
        {
            int carry=0,i1=num1.size()-1,i2=num2.size()-1;
            string sum="";
            for(int i=num2.size()-1;i>=0;--i)
            {
                string ret;
                i1 = num1.size() - 1;
                while(i1>=0||carry!=0)
                {
                    int x=i1>=0?num1[i1]-'0':0;
                    int y=(num2[i]-'0');
                    int multi=x*y+carry;
                    ret.push_back((multi%10)+'0');
                    carry=multi/10;
                    i1--;
                }
                reverse(ret.begin(),ret.end());//注意这里不是.end()-1
                int count=num2.size()-1-i;//计数添几个0
                while(count--)
                {
                    ret.push_back('0');
                }
                sum=addStrings(ret,sum);
            }
            return sum;
        }
        
        
    }
};

思路二

  1. 做乘法,由于两数相乘必为m+n或m+n-1

以上是关于题目之大数运算的主要内容,如果未能解决你的问题,请参考以下文章

大数运算之 Java BigInteger 的基本用法

大数运算——hdu1042N!

Java全栈JavaSE:19.常用类之大数运算日期和日历包装类

四:大数运算-乘法运算

五:大数运算-加法运算

c++实现大数运算