📜  两个大数的差

📅  最后修改于: 2021-05-04 08:33:08             🧑  作者: Mango

给定两个数字作为字符串。这些数字可能非常大(可能不适合int long int int),任务是找到这两个数字的差。

例子:

Input : str1 = "11443333311111111100", 
        str2 =     "1144422222221111"
Output : 11442188888888889989

Input :str1 = "122387876566565674",
       str2 =     "31435454654554"
Output : 122356441111911120

根据学校的数学,这很简单。我们从头到尾遍历两个字符串,一个接一个的减数位。

  1. 颠倒这两个字符串。
  2. 继续从第0个索引(在反向字符串)到较小字符串的末尾一一减去数字,如果对结果末尾为正,则添加diff。如果difference(diff)为负,则加10并保持进位为1(如果为正,则进位为0)。
  3. 最后,反转结果。

下面是上述想法的实现:

C++
// C++ program to find difference of two large numbers.
#include 
using namespace std;
 
// Returns true if str1 is smaller than str2.
bool isSmaller(string str1, string str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
 
    if (n1 < n2)
        return true;
    if (n2 < n1)
        return false;
 
    for (int i = 0; i < n1; i++)
        if (str1[i] < str2[i])
            return true;
        else if (str1[i] > str2[i])
            return false;
 
    return false;
}
 
// Function for find difference of larger numbers
string findDiff(string str1, string str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
        swap(str1, str2);
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate length of both string
    int n1 = str1.length(), n2 = str2.length();
 
    // Reverse both of strings
    reverse(str1.begin(), str1.end());
    reverse(str2.begin(), str2.end());
 
    int carry = 0;
 
    // Run loop till small string length
    // and subtract digit of str1 to str2
    for (int i = 0; i < n2; i++) {
        // Do school mathematics, compute difference of
        // current digits
 
        int sub
            = ((str1[i] - '0') - (str2[i] - '0') - carry);
 
        // If subtraction is less then zero
        // we add then we add 10 into sub and
        // take carry as 1 for calculating next step
        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
 
        str.push_back(sub + '0');
    }
 
    // subtract remaining digits of larger number
    for (int i = n2; i < n1; i++) {
        int sub = ((str1[i] - '0') - carry);
 
        // if the sub value is -ve, then make it positive
        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
 
        str.push_back(sub + '0');
    }
 
    // reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Driver code
int main()
{
    string str1 = "978";
    string str2 = "12977";
 
    // Function call
    cout << findDiff(str1, str2) << endl;
 
    string s1 = "100";
    string s2 = "1000000";
   
    // Function call
    cout << findDiff(s1, s2);
 
    return 0;
}


Java
// Java program to find difference of two large numbers.
import java.util.*;
 
class GFG {
 
    // Returns true if str1 is smaller than str2.
    static boolean isSmaller(String str1, String str2)
    {
        // Calculate lengths of both string
        int n1 = str1.length(), n2 = str2.length();
        if (n1 < n2)
            return true;
        if (n2 < n1)
            return false;
 
        for (int i = 0; i < n1; i++)
            if (str1.charAt(i) < str2.charAt(i))
                return true;
            else if (str1.charAt(i) > str2.charAt(i))
                return false;
 
        return false;
    }
 
    // Function for find difference of larger numbers
    static String findDiff(String str1, String str2)
    {
        // Before proceeding further, make sure str1
        // is not smaller
        if (isSmaller(str1, str2)) {
            String t = str1;
            str1 = str2;
            str2 = t;
        }
 
        // Take an empty string for storing result
        String str = "";
 
        // Calculate length of both string
        int n1 = str1.length(), n2 = str2.length();
 
        // Reverse both of strings
        str1 = new StringBuilder(str1).reverse().toString();
        str2 = new StringBuilder(str2).reverse().toString();
 
        int carry = 0;
 
        // Run loop till small string length
        // and subtract digit of str1 to str2
        for (int i = 0; i < n2; i++) {
            // Do school mathematics, compute difference of
            // current digits
            int sub
                = ((int)(str1.charAt(i) - '0')
                   - (int)(str2.charAt(i) - '0') - carry);
 
            // If subtraction is less then zero
            // we add then we add 10 into sub and
            // take carry as 1 for calculating next step
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += (char)(sub + '0');
        }
 
        // subtract remaining digits of larger number
        for (int i = n2; i < n1; i++) {
            int sub = ((int)(str1.charAt(i) - '0') - carry);
 
            // if the sub value is -ve, then make it
            // positive
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += (char)(sub + '0');
        }
 
        // reverse resultant string
        return new StringBuilder(str).reverse().toString();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str1 = "978";
        String str2 = "12977";
 
        // Function call
        System.out.println(findDiff(str1, str2));
 
        String s1 = "100";
        String s2 = "1000000";
       
        // Function call
        System.out.println(findDiff(s1, s2));
    }
}
 
// This code is contributed by mits


Python3
# Python 3 program to find difference of two large numbers.
 
# Returns true if str1 is smaller than str2.
 
 
def isSmaller(str1, str2):
 
    # Calculate lengths of both string
    n1 = len(str1)
    n2 = len(str2)
 
    if (n1 < n2):
        return True
    if (n2 < n1):
        return False
 
    for i in range(n1):
        if (str1[i] < str2[i]):
            return True
        elif (str1[i] > str2[i]):
            return False
 
    return False
 
# Function for find difference of larger numbers
 
 
def findDiff(str1, str2):
 
    # Before proceeding further, make sure str1
    # is not smaller
    if (isSmaller(str1, str2)):
        temp = str1
        str1 = str2
        str2 = temp
 
    # Take an empty string for storing result
    str3 = ""
 
    # Calculate length of both string
    n1 = len(str1)
    n2 = len(str2)
 
    # Reverse both of strings
    str1 = str1[::-1]
    str2 = str2[::-1]
 
    carry = 0
 
    # Run loop till small string length
    # and subtract digit of str1 to str2
    for i in range(n2):
 
        # Do school mathematics, compute difference of
        # current digits
 
        sub = ((ord(str1[i])-ord('0'))-(ord(str2[i])-ord('0'))-carry)
 
        # If subtraction is less then zero
        # we add then we add 10 into sub and
        # take carry as 1 for calculating next step
        if (sub < 0):
 
            sub = sub + 10
            carry = 1
 
        else:
            carry = 0
 
        str3 = str3+str(sub)
 
    # subtract remaining digits of larger number
    for i in range(n2, n1):
 
        sub = ((ord(str1[i])-ord('0')) - carry)
 
        # if the sub value is -ve, then make it positive
        if (sub < 0):
 
            sub = sub + 10
            carry = 1
 
        else:
            carry = 0
 
        str3 = str3+str(sub)
 
    # reverse resultant string
    str3 = str3[::-1]
 
    return str3
 
 
# Driver code
if __name__ == "__main__":
    str1 = "978"
    str2 = "12977"
     
    # Function call
    print(findDiff(str1, str2))
 
    s1 = "100"
    s2 = "1000000"
     
    # Function call
    print(findDiff(s1, s2))
 
# This code is contributed by ChitraNayal


C#
// C# program to find difference of two large numbers.
using System;
using System.Collections;
 
class GFG {
 
    // Returns true if str1 is smaller than str2.
    static bool isSmaller(string str1, string str2)
    {
        // Calculate lengths of both string
        int n1 = str1.Length, n2 = str2.Length;
        if (n1 < n2)
            return true;
        if (n2 < n1)
            return false;
 
        for (int i = 0; i < n1; i++)
            if (str1[i] < str2[i])
                return true;
            else if (str1[i] > str2[i])
                return false;
 
        return false;
    }
 
    // Function for find difference of larger numbers
    static string findDiff(string str1, string str2)
    {
        // Before proceeding further, make sure str1
        // is not smaller
        if (isSmaller(str1, str2)) {
            string t = str1;
            str1 = str2;
            str2 = t;
        }
 
        // Take an empty string for storing result
        string str = "";
 
        // Calculate length of both string
        int n1 = str1.Length, n2 = str2.Length;
 
        // Reverse both of strings
        char[] ch1 = str1.ToCharArray();
        Array.Reverse(ch1);
        str1 = new string(ch1);
        char[] ch2 = str2.ToCharArray();
        Array.Reverse(ch2);
        str2 = new string(ch2);
 
        int carry = 0;
 
        // Run loop till small string length
        // and subtract digit of str1 to str2
        for (int i = 0; i < n2; i++) {
            // Do school mathematics, compute difference of
            // current digits
            int sub = ((int)(str1[i] - '0')
                       - (int)(str2[i] - '0') - carry);
 
            // If subtraction is less then zero
            // we add then we add 10 into sub and
            // take carry as 1 for calculating next step
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += (char)(sub + '0');
        }
 
        // subtract remaining digits of larger number
        for (int i = n2; i < n1; i++) {
            int sub = ((int)(str1[i] - '0') - carry);
 
            // if the sub value is -ve, then make it
            // positive
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += (char)(sub + '0');
        }
 
        // reverse resultant string
        char[] ch3 = str.ToCharArray();
        Array.Reverse(ch3);
        return new string(ch3);
    }
 
    // Driver code
    public static void Main()
    {
        string str1 = "978";
        string str2 = "12977";
 
        // Function call
        Console.WriteLine(findDiff(str1, str2));
 
        string s1 = "100";
        string s2 = "1000000";
       
        // Function call
        Console.WriteLine(findDiff(s1, s2));
    }
}
 
// This code is contributed by mits


PHP
 $str2[$i])
        return false;
 
    return false;
}
 
// Function for find difference of larger numbers
function findDiff($str1, $str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller($str1, $str2)){
        $t=$str1;
        $str1=$str2;
        $str2=$t;
    }
 
    // Take an empty string for storing result
    $str = "";
 
    // Calculate length of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
 
    // Reverse both of strings
    $str1=strrev($str1);
    $str2=strrev($str2);
     
    $carry = 0;
 
    // Run loop till small string length
    // and subtract digit of str1 to str2
    for ($i=0; $i<$n2; $i++)
    {
        // Do school mathematics, compute difference of
        // current digits
         
        $sub=((ord($str1[$i])-ord('0'))-(ord($str2[$i])-ord('0'))-$carry);
         
        // If subtraction is less then zero
        // we add then we add 10 into sub and
        // take carry as 1 for calculating next step
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
 
        $str.=chr($sub+48);
    }
 
    // subtract remaining digits of larger number
    for ($i=$n2; $i<$n1; $i++)
    {
        $sub = ((ord($str1[$i])-ord('0')) - $carry);
         
        // if the sub value is -ve, then make it positive
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
             
        $str.=chr($sub+48);
    }
 
    // reverse resultant string
    $str=strrev($str);
 
    return $str;
}
 
// Driver code
 
    $str1 = "978";
    $str2 = "12977";
 
    // Function call
    echo findDiff($str1, $str2)."\n";
     
    $s1 = "100";
    $s2 = "1000000";
 
    // Function call
    echo findDiff($s1,$s2);
     
// This code is contributed by mits
?>


C++
// C++ program to find difference of two large numbers.
#include 
using namespace std;
 
// Returns true if str1 is smaller than str2,
// else false.
bool isSmaller(string str1, string str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
 
    if (n1 < n2)
        return true;
    if (n2 < n1)
        return false;
 
    for (int i = 0; i < n1; i++) {
        if (str1[i] < str2[i])
            return true;
        else if (str1[i] > str2[i])
            return false;
    }
    return false;
}
 
// Function for finding difference of larger numbers
string findDiff(string str1, string str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
        swap(str1, str2);
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
    int diff = n1 - n2;
 
    // Initially take carry zero
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n2 - 1; i >= 0; i--) {
        // Do school mathematics, compute difference of
        // current digits and carry
        int sub = ((str1[i + diff] - '0') - (str2[i] - '0')
                   - carry);
        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
 
        str.push_back(sub + '0');
    }
 
    // subtract remaining digits of str1[]
    for (int i = n1 - n2 - 1; i >= 0; i--) {
        if (str1[i] == '0' && carry) {
            str.push_back('9');
            continue;
        }
        int sub = ((str1[i] - '0') - carry);
        if (i > 0 || sub > 0) // remove preceding 0's
            str.push_back(sub + '0');
        carry = 0;
    }
 
    // reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Driver code
int main()
{
    string str1 = "88";
    string str2 = "1079";
   
    // Function call
    cout << findDiff(str1, str2);
    return 0;
}


Java
// Java program to find difference of two large numbers.
 
class GFG {
 
    // Returns true if str1 is smaller than str2,
    // else false.
    static boolean isSmaller(String str1, String str2)
    {
        // Calculate lengths of both string
        int n1 = str1.length(), n2 = str2.length();
 
        if (n1 < n2)
            return true;
        if (n2 < n1)
            return false;
 
        for (int i = 0; i < n1; i++) {
            if (str1.charAt(i) < str2.charAt(i))
                return true;
            else if (str1.charAt(i) > str2.charAt(i))
                return false;
        }
        return false;
    }
 
    // Function for finding difference of larger numbers
    static String findDiff(String str1, String str2)
    {
        // Before proceeding further, make sure str1
        // is not smaller
        if (isSmaller(str1, str2)) {
            String t = str1;
            str1 = str2;
            str2 = t;
        }
 
        // Take an empty string for storing result
        String str = "";
 
        // Calculate lengths of both string
        int n1 = str1.length(), n2 = str2.length();
        int diff = n1 - n2;
 
        // Initially take carry zero
        int carry = 0;
 
        // Traverse from end of both strings
        for (int i = n2 - 1; i >= 0; i--) {
            // Do school mathematics, compute difference of
            // current digits and carry
            int sub
                = (((int)str1.charAt(i + diff) - (int)'0')
                   - ((int)str2.charAt(i) - (int)'0')
                   - carry);
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += String.valueOf(sub);
        }
 
        // subtract remaining digits of str1[]
        for (int i = n1 - n2 - 1; i >= 0; i--) {
            if (str1.charAt(i) == '0' && carry > 0) {
                str += "9";
                continue;
            }
            int sub = (((int)str1.charAt(i) - (int)'0')
                       - carry);
            if (i > 0 || sub > 0) // remove preceding 0's
                str += String.valueOf(sub);
            carry = 0;
        }
 
        // reverse resultant string
        return new StringBuilder(str).reverse().toString();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str1 = "88";
        String str2 = "1079";
       
        // Function call
        System.out.println(findDiff(str1, str2));
    }
}
 
// This code is contributed by mits


Python3
# Python3 program to find difference
# of two large numbers.
 
# Returns true if str1 is smaller than
# str2, else false.
def isSmaller(str1, str2):
     
    # Calculate lengths of both string
    n1 = len(str1)
    n2 = len(str2)
 
    if (n1 < n2):
        return True
    if (n2 < n1):
        return False
 
    for i in range(n1):
        if (str1[i] < str2[i]):
            return True
        elif (str1[i] > str2[i]):
            return False
             
    return False
 
# Function for finding difference
# of larger numbers
def findDiff(str1, str2):
     
    # Before proceeding further,
    # make sure str1 is not smaller
    if (isSmaller(str1, str2)):
        str1, str2 = str2, str1
 
    # Take an empty string for
    # storing result
    Str = ""
     
    # Calculate lengths of both string
    n1 = len(str1)
    n2 = len(str2)
    diff = n1 - n2
     
    # Initially take carry zero
    carry = 0
     
    # Traverse from end of both strings
    for i in range(n2 - 1, -1, -1):
         
        # Do school mathematics, compute
        # difference of current digits
        # and carry
        sub = ((ord(str1[i + diff]) - ord('0')) -
               (ord(str2[i]) - ord('0')) - carry)
 
        if (sub < 0):
            sub += 10
            carry = 1
        else:
            carry = 0
 
        Str += chr(sub + ord('0'))
     
    # Subtract remaining digits of str1[]
    for i in range(n1 - n2 - 1, -1, -1):
        if (str1[i] == '0' and carry):
            Str += '9'
            continue
             
        sub = (ord(str1[i]) - ord('0')) - carry
         
        # Remove preceding 0's
        if (i > 0 or sub > 0):
            Str += chr(sub + ord('0'))
             
        carry = 0
 
    # Reverse resultant string
    Str = Str[::-1]
     
    return Str
 
# Driver code
str1 = "88"
str2 = "1079"
 
# Function call
print(findDiff(str1, str2))
 
# This code is contributed by avanitrachhadiya2155


C#
// C# program to find difference of
// two large numbers.
using System;
 
class GFG {
 
    // Returns true if str1 is smaller
    // than str2, else false.
    static bool isSmaller(string str1, string str2)
    {
        // Calculate lengths of both string
        int n1 = str1.Length, n2 = str2.Length;
 
        if (n1 < n2)
            return true;
        if (n2 < n1)
            return false;
 
        for (int i = 0; i < n1; i++) {
            if (str1[i] < str2[i])
                return true;
            else if (str1[i] > str2[i])
                return false;
        }
        return false;
    }
 
    // Function for finding difference of
    // larger numbers
    static string findDiff(string str1, string str2)
    {
        // Before proceeding further,
        // make sure str1 is not smaller
        if (isSmaller(str1, str2)) {
            string t = str1;
            str1 = str2;
            str2 = t;
        }
 
        // Take an empty string for
        // storing result
        String str = "";
 
        // Calculate lengths of both string
        int n1 = str1.Length, n2 = str2.Length;
        int diff = n1 - n2;
 
        // Initially take carry zero
        int carry = 0;
 
        // Traverse from end of both strings
        for (int i = n2 - 1; i >= 0; i--) {
            // Do school mathematics, compute
            // difference of current digits and carry
            int sub = (((int)str1[i + diff] - (int)'0')
                       - ((int)str2[i] - (int)'0') - carry);
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += sub.ToString();
        }
 
        // subtract remaining digits of str1[]
        for (int i = n1 - n2 - 1; i >= 0; i--) {
            if (str1[i] == '0' && carry > 0) {
                str += "9";
                continue;
            }
            int sub = (((int)str1[i] - (int)'0') - carry);
            if (i > 0 || sub > 0) // remove preceding 0's
                str += sub.ToString();
            carry = 0;
        }
 
        // reverse resultant string
        char[] aa = str.ToCharArray();
        Array.Reverse(aa);
        return new string(aa);
    }
 
    // Driver code
    public static void Main()
    {
        String str1 = "88";
        String str2 = "1079";
 
        // Function call
        Console.WriteLine(findDiff(str1, str2));
    }
}
 
// This code is contributed by mits


PHP
 $str2[$i])
            return false;
    }
    return false;
}
 
// Function for finding difference
// of larger numbers
function findDiff($str1, $str2)
{
    // Before proceeding further, make
    // sure str1 is not smaller
    if (isSmaller($str1, $str2))
    {
        $t = $str1;
        $str1 = $str2;
        $str2 = $t;
    }
 
    // Take an empty string for storing result
    $str = "";
 
    // Calculate lengths of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
    $diff = $n1 - $n2;
 
    // Initially take carry zero
    $carry = 0;
 
    // Traverse from end of both strings
    for ($i = $n2 - 1; $i >= 0; $i--)
    {
        // Do school mathematics, compute
        // difference of current digits and carry
        $sub = ((ord($str1[$i + $diff]) - ord('0')) -
                (ord($str2[$i]) - ord('0')) - $carry);
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
 
        $str.=chr($sub + ord("0"));
    }
 
    // subtract remaining digits of str1[]
    for ($i = $n1 - $n2 - 1; $i >= 0; $i--)
    {
        if ($str1[$i] == '0' && $carry > 0)
        {
            $str.="9";
            continue;
        }
        $sub = (ord($str1[$i]) - ord('0') - $carry);
        if ($i > 0 || $sub > 0) // remove preceding 0's
            $str.=chr($sub + ord("0"));
        $carry = 0;
 
    }
 
    // reverse resultant string
    return strrev($str);
 
}
 
// Driver code
$str1 = "88";
$str2 = "1079";
 
// Function call
print(findDiff($str1, $str2));
 
// This code is contributed by chandan_jnu
?>


输出
11999
0999900

时间复杂度: O(n1 + n2)

辅助空间: O(max(n1,n2))
优化的解决方案:
我们可以通过从头开始遍历它们来避免前两个字符串反向操作。

以下是优化的解决方案。

C++

// C++ program to find difference of two large numbers.
#include 
using namespace std;
 
// Returns true if str1 is smaller than str2,
// else false.
bool isSmaller(string str1, string str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
 
    if (n1 < n2)
        return true;
    if (n2 < n1)
        return false;
 
    for (int i = 0; i < n1; i++) {
        if (str1[i] < str2[i])
            return true;
        else if (str1[i] > str2[i])
            return false;
    }
    return false;
}
 
// Function for finding difference of larger numbers
string findDiff(string str1, string str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
        swap(str1, str2);
 
    // Take an empty string for storing result
    string str = "";
 
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
    int diff = n1 - n2;
 
    // Initially take carry zero
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n2 - 1; i >= 0; i--) {
        // Do school mathematics, compute difference of
        // current digits and carry
        int sub = ((str1[i + diff] - '0') - (str2[i] - '0')
                   - carry);
        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
 
        str.push_back(sub + '0');
    }
 
    // subtract remaining digits of str1[]
    for (int i = n1 - n2 - 1; i >= 0; i--) {
        if (str1[i] == '0' && carry) {
            str.push_back('9');
            continue;
        }
        int sub = ((str1[i] - '0') - carry);
        if (i > 0 || sub > 0) // remove preceding 0's
            str.push_back(sub + '0');
        carry = 0;
    }
 
    // reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Driver code
int main()
{
    string str1 = "88";
    string str2 = "1079";
   
    // Function call
    cout << findDiff(str1, str2);
    return 0;
}

Java

// Java program to find difference of two large numbers.
 
class GFG {
 
    // Returns true if str1 is smaller than str2,
    // else false.
    static boolean isSmaller(String str1, String str2)
    {
        // Calculate lengths of both string
        int n1 = str1.length(), n2 = str2.length();
 
        if (n1 < n2)
            return true;
        if (n2 < n1)
            return false;
 
        for (int i = 0; i < n1; i++) {
            if (str1.charAt(i) < str2.charAt(i))
                return true;
            else if (str1.charAt(i) > str2.charAt(i))
                return false;
        }
        return false;
    }
 
    // Function for finding difference of larger numbers
    static String findDiff(String str1, String str2)
    {
        // Before proceeding further, make sure str1
        // is not smaller
        if (isSmaller(str1, str2)) {
            String t = str1;
            str1 = str2;
            str2 = t;
        }
 
        // Take an empty string for storing result
        String str = "";
 
        // Calculate lengths of both string
        int n1 = str1.length(), n2 = str2.length();
        int diff = n1 - n2;
 
        // Initially take carry zero
        int carry = 0;
 
        // Traverse from end of both strings
        for (int i = n2 - 1; i >= 0; i--) {
            // Do school mathematics, compute difference of
            // current digits and carry
            int sub
                = (((int)str1.charAt(i + diff) - (int)'0')
                   - ((int)str2.charAt(i) - (int)'0')
                   - carry);
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += String.valueOf(sub);
        }
 
        // subtract remaining digits of str1[]
        for (int i = n1 - n2 - 1; i >= 0; i--) {
            if (str1.charAt(i) == '0' && carry > 0) {
                str += "9";
                continue;
            }
            int sub = (((int)str1.charAt(i) - (int)'0')
                       - carry);
            if (i > 0 || sub > 0) // remove preceding 0's
                str += String.valueOf(sub);
            carry = 0;
        }
 
        // reverse resultant string
        return new StringBuilder(str).reverse().toString();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str1 = "88";
        String str2 = "1079";
       
        // Function call
        System.out.println(findDiff(str1, str2));
    }
}
 
// This code is contributed by mits

Python3

# Python3 program to find difference
# of two large numbers.
 
# Returns true if str1 is smaller than
# str2, else false.
def isSmaller(str1, str2):
     
    # Calculate lengths of both string
    n1 = len(str1)
    n2 = len(str2)
 
    if (n1 < n2):
        return True
    if (n2 < n1):
        return False
 
    for i in range(n1):
        if (str1[i] < str2[i]):
            return True
        elif (str1[i] > str2[i]):
            return False
             
    return False
 
# Function for finding difference
# of larger numbers
def findDiff(str1, str2):
     
    # Before proceeding further,
    # make sure str1 is not smaller
    if (isSmaller(str1, str2)):
        str1, str2 = str2, str1
 
    # Take an empty string for
    # storing result
    Str = ""
     
    # Calculate lengths of both string
    n1 = len(str1)
    n2 = len(str2)
    diff = n1 - n2
     
    # Initially take carry zero
    carry = 0
     
    # Traverse from end of both strings
    for i in range(n2 - 1, -1, -1):
         
        # Do school mathematics, compute
        # difference of current digits
        # and carry
        sub = ((ord(str1[i + diff]) - ord('0')) -
               (ord(str2[i]) - ord('0')) - carry)
 
        if (sub < 0):
            sub += 10
            carry = 1
        else:
            carry = 0
 
        Str += chr(sub + ord('0'))
     
    # Subtract remaining digits of str1[]
    for i in range(n1 - n2 - 1, -1, -1):
        if (str1[i] == '0' and carry):
            Str += '9'
            continue
             
        sub = (ord(str1[i]) - ord('0')) - carry
         
        # Remove preceding 0's
        if (i > 0 or sub > 0):
            Str += chr(sub + ord('0'))
             
        carry = 0
 
    # Reverse resultant string
    Str = Str[::-1]
     
    return Str
 
# Driver code
str1 = "88"
str2 = "1079"
 
# Function call
print(findDiff(str1, str2))
 
# This code is contributed by avanitrachhadiya2155

C#

// C# program to find difference of
// two large numbers.
using System;
 
class GFG {
 
    // Returns true if str1 is smaller
    // than str2, else false.
    static bool isSmaller(string str1, string str2)
    {
        // Calculate lengths of both string
        int n1 = str1.Length, n2 = str2.Length;
 
        if (n1 < n2)
            return true;
        if (n2 < n1)
            return false;
 
        for (int i = 0; i < n1; i++) {
            if (str1[i] < str2[i])
                return true;
            else if (str1[i] > str2[i])
                return false;
        }
        return false;
    }
 
    // Function for finding difference of
    // larger numbers
    static string findDiff(string str1, string str2)
    {
        // Before proceeding further,
        // make sure str1 is not smaller
        if (isSmaller(str1, str2)) {
            string t = str1;
            str1 = str2;
            str2 = t;
        }
 
        // Take an empty string for
        // storing result
        String str = "";
 
        // Calculate lengths of both string
        int n1 = str1.Length, n2 = str2.Length;
        int diff = n1 - n2;
 
        // Initially take carry zero
        int carry = 0;
 
        // Traverse from end of both strings
        for (int i = n2 - 1; i >= 0; i--) {
            // Do school mathematics, compute
            // difference of current digits and carry
            int sub = (((int)str1[i + diff] - (int)'0')
                       - ((int)str2[i] - (int)'0') - carry);
            if (sub < 0) {
                sub = sub + 10;
                carry = 1;
            }
            else
                carry = 0;
 
            str += sub.ToString();
        }
 
        // subtract remaining digits of str1[]
        for (int i = n1 - n2 - 1; i >= 0; i--) {
            if (str1[i] == '0' && carry > 0) {
                str += "9";
                continue;
            }
            int sub = (((int)str1[i] - (int)'0') - carry);
            if (i > 0 || sub > 0) // remove preceding 0's
                str += sub.ToString();
            carry = 0;
        }
 
        // reverse resultant string
        char[] aa = str.ToCharArray();
        Array.Reverse(aa);
        return new string(aa);
    }
 
    // Driver code
    public static void Main()
    {
        String str1 = "88";
        String str2 = "1079";
 
        // Function call
        Console.WriteLine(findDiff(str1, str2));
    }
}
 
// This code is contributed by mits

的PHP

 $str2[$i])
            return false;
    }
    return false;
}
 
// Function for finding difference
// of larger numbers
function findDiff($str1, $str2)
{
    // Before proceeding further, make
    // sure str1 is not smaller
    if (isSmaller($str1, $str2))
    {
        $t = $str1;
        $str1 = $str2;
        $str2 = $t;
    }
 
    // Take an empty string for storing result
    $str = "";
 
    // Calculate lengths of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
    $diff = $n1 - $n2;
 
    // Initially take carry zero
    $carry = 0;
 
    // Traverse from end of both strings
    for ($i = $n2 - 1; $i >= 0; $i--)
    {
        // Do school mathematics, compute
        // difference of current digits and carry
        $sub = ((ord($str1[$i + $diff]) - ord('0')) -
                (ord($str2[$i]) - ord('0')) - $carry);
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
 
        $str.=chr($sub + ord("0"));
    }
 
    // subtract remaining digits of str1[]
    for ($i = $n1 - $n2 - 1; $i >= 0; $i--)
    {
        if ($str1[$i] == '0' && $carry > 0)
        {
            $str.="9";
            continue;
        }
        $sub = (ord($str1[$i]) - ord('0') - $carry);
        if ($i > 0 || $sub > 0) // remove preceding 0's
            $str.=chr($sub + ord("0"));
        $carry = 0;
 
    }
 
    // reverse resultant string
    return strrev($str);
 
}
 
// Driver code
$str1 = "88";
$str2 = "1079";
 
// Function call
print(findDiff($str1, $str2));
 
// This code is contributed by chandan_jnu
?>
输出
991

时间复杂度: O(n1 + n2)

辅助空间: O(max(n1,n2))