Pergunta da entrevista: Realize a aritmética da adição, subtração, multiplicação e divisão de grandes números

#include <iostream>
#include <cstdlib>
#include <vector>
#include <sstream>
#include <algorithm>
usando o namespace std;

classe Solution {
public:
string addTwoString (string nums1, string nums2) {
int n1 = nums1.size ();
int n2 = nums2.size ();
// Operação conveniente, conversão unificada em número longo mais número curto
se (n1 < n2)
retorna addTwoString (nums2, nums1);

int minlen = n2;
int maxlen = n1;
resultado de string;
int carry = 0;
for (int i = 0; i <minlen; i ++) {
int sum = nums1 [- n1] - '0' + nums2 [- n2] - '0' + carry;
carry = soma / 10;
int a = soma% 10;
result.push_back (a + '0');
}
for (int i = minlen; i <maxlen; i ++) {
int sum = nums1 [- n1] - '0' + carry;
carry = soma / 10;
int a = soma% 10;
result.push_back (a + '0');
}

if (carry! = 0)
result.push_back (carry + '0');

reverse (result.begin (), result.end ());
resultado de retorno;
}

string multiplyTwoString (string nums1, string nums2) {
string result = "0";
if (nums1 == "0" || nums2 == "0")
retorna resultado;

vetor <string> tmpResult;
int n1 = nums1.size ();
int n2 = nums2.size ();

int carry = 0;
reverse (nums1.begin (), nums1.end ());
reverse (nums2.begin (), nums2.end ());

for (int i = 0; i <n1; i ++) {
string str;
for (int j = 0; j <n2; j ++) {
int sum = (nums1 [i] - '0') * (nums2 [j] - '0') + carry;
carry = soma / 10;
int a = soma - transporte * 10;
str.push_back (a + '0');
}
if (carry! = 0)
str.push_back (carry + '0');
carry = 0;
reverse (str.begin (), str.end ());
for (int k = 0; k <i; k ++) {
str.push_back ('0');
}
tmpResult.push_back (str);
}

int tamanho = tmpResult.size ();

for (int i = 0; i <tamanho; i ++) {
resultado = addTwoString (resultado, tmpResult [i]);
}
retornar resultado;
}

string substractTwoString (string nums1, string nums2) {
resultado da string;
int n1 = nums1.size ();
int n2 = nums2.size ();

// julga que o sinal é positivo e negativo
char sign = '+';
if (n1 <n2) {
sign = '-';
nums1.swap (nums2);

} else if (n1 == n2) {
for (int i = 0; i <n1; i ++) {
if (nums1 [i]> nums2 [i]) {
quebra;
} else if (nums1 [i] <nums2 [i]) {
sign = '-';
nums1.swap (nums2);
pausa;
}
}
}
int emprestar = 0;
reverse (nums1.begin (), nums1.end ());
reverse (nums2.begin (), nums2.end ());

n1 = nums1.size ();
n2 = nums2.size ();

for (int i = 0; i <n2; i ++) {
int r = nums1 [i] - nums2 [i] - emprestar;
emprestar = 0;
se (r <0) {
r = r + 10;
emprestar = 1;
}
result.push_back (r + '0');
}

for (int i = n2; i <n1; i ++) {
int r = nums1 [i] - '0' - emprestado;
emprestar = 0;
se (r <0) {
r = r + 10;
emprestar = 1;
}
result.push_back (r + '0');
}

for (int i = n1-1; i> = 0; i--) {
if (resultado [i] == '0')
result.erase (result.begin () + i);
mais
quebrar;
}
reverse (result.begin (), result.end ());
if (sinal == '-') {
resultado.inserir (resultado.begin (), '-');
}
retornar resultado;
}


string divideTwoString (string nums1, string nums2) {
resultado da string;
resultado = substractTwoString (nums1, nums2);
if (resultado [0] == '-') {
resultado = "0";
resultado de retorno;
}
resultado = "";
int n1 = nums1.size ();

fluxo de strings;
dividendo de cordas;

for (int j = 0; j <n1; j ++) {
dividend.push_back (nums1 [j]); // Dividendo
// de 9 a 0, procurando provisoriamente por um quociente, quando o restante não é negativo, é o bit atual Os valores
para (int I = 9;. I> = 0; i--) {
stream.str ( "");
Fluxo << I;
Cadeia stream.str S = ();
string = multiplyTwoString SJ (nums2, S) ;
string permanece = substractTwoString (dividendo, sj);

if (permaneça [0]! = '-') {
result.push_back (i + '0');
dividendo = permanecer;
pausa;
}
}
}
//
int int = result.size ();
for (int i = 0; i <tamanho; i ++) {
if (result [0] == '0') {
result.erase (result.begin ());
} else {
break;
}
}
// 四舍五入
string s = substractTwoString (multiplyTwoString (dividendo, "2"), nums2);
if (s [0] == '-') addTwoString (resultado, "1");

resultado de retorno;
}
};

int main () {
string nums1 = "123456";
string nums2 = "789";
Solução s;
cout << s.addTwoString (nums1, nums2) << endl;
cout << s.multiplyTwoString (nums1, nums2) << endl;
cout << s.substractTwoString (nums1, nums2) << endl;
cout << s.divideTwoString (nums1, nums2) << endl;
retornar 0;
}

Acho que você gosta

Origin www.cnblogs.com/H-xiaofeng/p/12730992.html
Recomendado
Clasificación