インタビューの質問:大きな数の加算、減算、乗算、除算の演算を実現します

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

class Solution {
public:
string addTwoString(string nums1、string nums2){
int n1 = nums1.size();
int n2 = nums2.size();
//
(n1 < n2)
addTwoString(nums2、nums1);を返します。

int minlen = n2;
int maxlen = n1;
文字列の結果。
整数キャリー= 0;
for(int i = 0; i <minlen; i ++){
int sum = nums1 [-n1]-'0' + nums2 [-n2]-'0' +キャリー;
キャリー=合計/ 10;
int a = sum%10;
result.push_back(a + '0');
}
for(int i = minlen; i <maxlen; i ++){
int sum = nums1 [-n1]-'0' +キャリー;
キャリー=合計/ 10;
int a = sum%10;
result.push_back(a + '0');
}

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

reverse(result.begin()、result.end());
結果を返す;
}

string multiplyTwoString(string nums1、string nums2){
string result = "0";
if(nums1 == "0" || nums2 == "0")
結果を返す;

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

整数キャリー= 0;
reverse(nums1.begin()、nums1.end());
reverse(nums2.begin()、nums2.end());

for(int i = 0; i <n1; i ++){
文字列str;
for(int j = 0; j <n2; j ++){
int sum =(nums1 [i]-'0')*(nums2 [j]-'0')+キャリー;
キャリー=合計/ 10;
int a = sum-キャリー* 10;
str.push_back(a + '0');
}
if(carry!= 0)
str.push_back(carry + '0');
キャリー= 0;
reverse(str.begin()、str.end());
for(int k = 0; k <i; k ++){
str.push_back( '0');
}
tmpResult.push_back(str);
}

int size = tmpResult.size();

for(int i = 0; i <size; i ++){
result = addTwoString(result、tmpResult [i]);
}
結果を返します。
}

string substractTwoString(string nums1、string nums2){
string結果;
int n1 = nums1.size();
int n2 = nums2.size();

//符号が正および負であると判断します
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]){
break;
} else if(nums1 [i] <nums2 [i]){
sign = '-';
nums1.swap(nums2);
ブレーク;
}
}
}
intボロー= 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]-ボロー;
借用= 0;
if(r <0){
r = r + 10;
借用= 1;
}
result.push_back(r + '0');
}

for(int i = n2; i <n1; i ++){
int r = nums1 [i]-'0'-ボロー;
借用= 0;
if(r <0){
r = r + 10;
借用= 1;
}
result.push_back(r + '0');
}

for(int i = n1-1; i> = 0; i--){
if(result [i] == '0')
result.erase(result.begin()+ i);
そうでなければ
壊れる;
}
reverse(result.begin()、result.end());
if(sign == '-'){
result.insert(result.begin()、 '-');
}
結果を返します。
}


string divideTwoString(string nums1、string nums2){
string result;
結果= substractTwoString(nums1、nums2);
if(result [0] == '-'){
result = "0";
結果を返す;
}
結果= "";
int n1 = nums1.size();

stringstreamストリーム。
文字列配当;

for(int j = 0; j <n1; j ++){
配当.push_back(nums1 [j]); //
9から0への配当//商を暫定的に探し、剰余が負でない場合、現在のビット値
のための(INT I = 9; I> = 0; i--){
stream.str( "");
ストリーム<< I;
列stream.str S =();
文字列= multiplyTwoStringのSJ(nums2、S) ;
文字列残り= substractTwoString(被除数、sj);

if(remain [0]!= '-'){
result.push_back(i + '0');
配当=残り;
ブレーク;
}
}
}
//去去商前的零位
int size = result.size();
for(int i = 0; i <size; i ++){
if(result [0] == '0'){
result.erase(result.begin());
} else {
break;
}
}
//四舍五入
string s = substractTwoString (multiplyTwoString(dividend、 "2")、nums2);
if(s [0] == '-')addTwoString(result、 "1");

結果を返す;
}
};

int main(){
string nums1 = "123456";
文字列nums2 = "789";
ソリューション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;
0を返します。
}

おすすめ

転載: www.cnblogs.com/H-xiaofeng/p/12730992.html