-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSubtractor.cpp
137 lines (122 loc) · 3.82 KB
/
Subtractor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
Authors: Eduardo Migueis and Rodrigo Smith.
Repository: https://github.com/edumigueis/Base-Calculator
License: MIT License.
*/
#pragma once
#include <iostream>
#include<string>
#include <stdlib.h>
#include "Converter.cpp"
#include "NumberFormatter.cpp"
using std::string;
class Subtractor {
private:
vector<char> numberA, numberB;
int base;
void formatNumbers() {
auto it = find(numberA.begin(), numberA.end(), ',');
int commaA = std::distance(numberA.begin(), it);
auto itB = find(numberB.begin(), numberB.end(), ',');
int commaB = std::distance(numberB.begin(), itB);
if (commaA >= numberA.size() && commaB >= numberB.size()) {
if (commaA > commaB)
numberB = NumberFormatter::completeWithZerosLeft(numberB, numberA.size());
else
numberA = NumberFormatter::completeWithZerosLeft(numberA, numberB.size());
}
else {
if (commaA >= numberA.size())
numberA = NumberFormatter::addComma(numberA, numberB.size() - commaB);
else
if (commaB >= numberB.size())
numberB = NumberFormatter::addComma(numberB, numberA.size() - commaA);
else {
if (numberA.size() - commaA < numberB.size() - commaB) {
numberA = NumberFormatter::completeWithZerosRight(numberA, numberB.size() - (commaB + 1), commaA);
}
else
numberB = NumberFormatter::completeWithZerosRight(numberB, numberA.size() - (commaA + 1), commaB);
}
if (commaA > commaB)
numberB = NumberFormatter::completeWithZerosLeft(numberB, numberA.size());
else
numberA = NumberFormatter::completeWithZerosLeft(numberA, numberB.size());
}
}
public:
Subtractor(string numberA, string numberB, int numberBase) {
this->numberA = Converter::stringToCharArray(numberA);
this->numberB = Converter::stringToCharArray(numberB);
this->base = numberBase;
}
void setNumberA(string numberA) {
this->numberA = Converter::stringToCharArray(numberA);
}
void setNumberB(string numberB) {
this->numberB = Converter::stringToCharArray(numberB);
}
string getNumberA() {
return Converter::charArrayToString(this->numberA);
}
string getNumberB() {
return Converter::charArrayToString(this->numberB);
}
string subtract() {
formatNumbers();
string res;
bool isNegative = false;
for (int i2 = 0; i2 < numberA.size(); i2++) {
if (Converter::convertCharToInt(numberA[i2]) < Converter::convertCharToInt(numberB[i2])) {
isNegative = true;
vector<char> aux(numberB.size());
for (int i3 = 0; i3 < numberB.size(); i3++) {
aux[i3] = numberB[i3];
}
numberB = numberA;
numberA = aux;
break;
}
else
break;
}
for (int i = numberA.size() - 1; i > -1; i--) {
if (numberA[i] != ',') {
int sub = Converter::convertCharToInt(numberA[i]) - Converter::convertCharToInt(numberB[i]);
if (sub < 0) {
int a = i;
bool enough = false;
bool positiveFound = false;
while (!enough) { //in case there are zeros in the number
if (!positiveFound)
a--;
else
a++;
int current = Converter::convertCharToInt(numberA[a]);
if (current > 0) {
current--;
numberA[a] = Converter::convertIntToChar(current); //aqui tem q salvar na posição do current o current-- e adicionar a valor da base no sub
numberA[a + 1] = Converter::convertIntToChar(Converter::convertCharToInt(numberA[a + 1]) + base);
positiveFound = true;
}
if (a == i - 1 && positiveFound == true)
enough = true;
}
//borrow base value from next iteration
sub = Converter::convertCharToInt(numberA[i]) - Converter::convertCharToInt(numberB[i]);
}
if (sub >= 0)
res += Converter::convertIntToChar(sub);
else
if(sub < 0 && i <=0)
res += std::to_string(sub *-1);
}
else
res += ",";
}
std::reverse(res.begin(), res.end());
if (isNegative == true)
res = NumberFormatter::addMinusSign(res);
return res;
}
};