Resta de dos números grandes usando complemento a 10

Dadas dos strings str1 y str2 de longitudes dadas N y M respectivamente, cada una de las cuales representa un número grande, la tarea es restar una de la otra usando el complemento de 10 .

Ejemplo: 

Entrada: N = 10, str1 = “3434243434”, M = 14, str2 = “22324365765767” 
Salida: 22320931522333

Entrada: N = 20, str1 = «12345334233242431433», M = 20, str2 = «12345334233242431432» 
Salida:

Enfoque: La idea básica es similar a la Resta de dos números usando el complemento a 2

La resta de strings dadas se puede escribir como 
Str1 – Str2 = Str1 + (- Str2) = Str1 + (complemento de 10 de Str2)

Siga los pasos a continuación para resolver el problema:  

  • Compare las longitudes de las dos strings y almacene la menor de las dos en str2 .
  • Calcule el complemento a 10 de str2 .
  • Ahora, agregue el complemento de 10 de str2 a str1 .
  • Si se genera algún acarreo, descarte el acarreo.
  • Si no se genera ningún acarreo, entonces el complemento de str1 es la respuesta final .

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ Program to calculate the
// subtraction of two large number
// using 10's complement
#include <bits/stdc++.h>
using namespace std;
 
// Function to return sum of two
// large numbers given as strings
string sumBig(string a, string b)
{
 
    // Compare their lengths
    if (a.length() > b.length())
        swap(a, b);
 
    // Stores the result
    string str = "";
 
    // Store the respective lengths
    int n1 = a.length(), n2 = b.length();
 
    int diff = n2 - n1;
 
    // Initialize carry
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n1 - 1; i >= 0; i--) {
 
        // Compute sum of
        // current digits and carry
        int sum
            = ((a[i] - '0')
               + (b[i + diff] - '0') + carry);
 
        // Store the result
        str.push_back(sum % 10 + '0');
 
        // Update carry
        carry = sum / 10;
    }
 
    // Add remaining digits of str2[]
    for (int i = n2 - n1 - 1; i >= 0; i--) {
 
        int sum = ((b[i] - '0') + carry);
 
        str.push_back(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry)
        str.push_back(carry + '0');
 
    // Reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Function return 10's
// complement of given number
string complement10(string v)
{
    // Stores the complement
    string complement = "";
 
    // Calculate 9's complement
    for (int i = 0; i < v.size(); i++) {
 
        // Subtract every bit from 9
        complement += '9' - v[i] + '0';
    }
 
    // Add 1 to 9's complement
    // to find 10's complement
    complement = sumBig(complement, "1");
    return complement;
}
 
// Function returns subtraction
// of two given numbers as strings
string subtract(string a, string b)
{
 
    // If second string is larger
    if (a.length() < b.length())
        swap(a, b);
 
    // Calculate respective lengths
    int l1 = a.length(), l2 = b.length();
 
    // If lengths aren't equal
    int diffLen = l1 - l2;
 
    for (int i = 0; i < diffLen; i++) {
 
        // Insert 0's to the beginning
        // of b to make both the lengths equal
        b = "0" + b;
    }
 
    // Add (complement of B) and A
    string c = sumBig(a, complement10(b));
 
    // If length of new string is greater
    // than length of first string,
    // than carry is generated
    if (c.length() > a.length()) {
        string::iterator it;
 
        // Erase first bit
        it = c.begin();
 
        c.erase(it);
 
        // Trim zeros at the beginning
        it = c.begin();
 
        while (*it == '0')
            c.erase(it);
 
        return c;
    }
 
    // If both lengths are equal
    else {
        return complement10(c);
    }
}
 
// Driver Code
int main()
{
 
    string str1 = "12345334233242431433";
    string str2 = "12345334233242431432";
 
    cout << subtract(str1, str2) << endl;
 
    return 0;
}
Producción: 

1

 

Complejidad de tiempo: O(max(N, M)) 
Espacio auxiliar: O(max(N, M))
 

Publicación traducida automáticamente

Artículo escrito por dilipthakkarnew y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *