Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #define maxSize 10
- using namespace std;
- struct NUM {
- int sign = 1;
- int data [maxSize] = {0};
- };
- NUM diff(NUM a, NUM b);
- NUM sum(NUM a, NUM b);
- void printNum(NUM number) {
- if(number.sign == -1) {
- cout<<"-";
- }
- bool flag = false;
- for(int i = 0; i < maxSize; i++) {
- if(number.data[i]!=0) {
- flag = true;
- }
- if(flag == true) {
- cout<<number.data[i];
- }
- }
- if(flag == false) {
- cout<<"0";
- }
- }
- NUM convertToNum(string s) {
- NUM number;
- int i = 0;
- if(s[0]=='-') {
- number.sign = -1;
- i = 1;
- } else {
- number.sign = 1;
- }
- for(i; i < s.size(); i++) {
- number.data[maxSize - s.size() + i] = s[i] - '0';
- }
- return number;
- }
- NUM sum(NUM a, NUM b) {
- NUM c;
- if(a.sign==b.sign) {
- for(int i = maxSize - 1; i >= 0; i--) {
- c.data[i] = c.data[i]+a.data[i]+b.data[i];
- if(c.data[i]>9) {
- c.data[i]-=10;
- c.data[i-1] = 1;
- }
- }
- c.sign = a.sign;
- }
- if(a.sign!=b.sign) {
- a.sign*= -1;
- c = diff(a, b);
- c.sign*= -1;
- }
- return c;
- }
- int compareNum(NUM a, NUM b) {
- if(a.sign == 1 && b.sign ==-1) {
- return 1;
- }
- if(a.sign == -1 && b.sign == 1) {
- return -1;
- }
- for(int i = 0; i < maxSize; i++) {
- if(a.sign == 1 && b.sign == 1 && a.data[i] > b.data[i] || a.sign == -1 && b.sign == -1 && a.data[i] < b.data[i]) {
- return 1;
- } else if(a.sign == 1 && b.sign ==1&& a.data[i] < b.data [i]||a.sign == -1 && b.sign== -1 && a.data[i] > b.data[i] ) {
- return -1;
- }
- }
- return 0;
- }
- void swap (NUM a, NUM b) {
- NUM c = b;
- b = a;
- a = c;
- }
- NUM difHelp(NUM a, NUM b) {
- NUM c;
- c.sign = 1;
- for(int i = maxSize -1 ; i >= 0; i--) {
- c.data[i] = c.data[i]+ a.data[i] - b.data[i];
- if(c.data[i] < 0) {
- c.data[i] += 10;
- c.data[i-1] = -1;
- }
- }
- return c;
- }
- NUM diff( NUM a, NUM b) {
- NUM c ;
- if(a.sign == 1 && b.sign == 1 && compareNum(a,b) == -1 || a.sign == -1 && b.sign == -1 && compareNum(a,b) == 1 ) {
- c = difHelp(a,b);
- c.sign = -1;
- }
- if(a.sign == -1 && b.sign == 1 && compareNum(a,b) == 1 || a.sign == -1 && b.sign == 1 && compareNum (a, b) == -1) {
- c = sum(a,b);
- c.sign = -1;
- }
- if(a.sign == 1 && b.sign == -1 && compareNum(a,b) == 1 || a.sign == 1 && b.sign == -1 && compareNum (a, b) == -1) {
- c = sum(a, b);
- c.sign = 1;
- }
- if(a.sign == 1 && b.sign == 1 && compareNum(a,b) == 1 ) {
- c = difHelp(a,b);
- c.sign = 1;
- }
- if(a.sign == -1 && b.sign == -1 && compareNum(a,b) == -1 ) {
- c = difHelp(b, a);
- c.sign = 1;
- }
- return c;
- }
- NUM mult10(NUM a) {
- for(int i = 0; i <= maxSize-2; i++) {
- a.data[i] = a.data[i+1];
- }
- a.data[maxSize-1] = 0;
- return a;
- }
- NUM multShort(NUM a, int p) {
- NUM c;
- for(int i = maxSize - 1; i >= 1; i--) {
- c.data[i] = c.data[i] + a.data[i]*p;
- if(c.data[i] > 9) {
- c.data[i-1] = c.data[i]/10;
- c.data[i] = c.data[i]%10;
- }
- }
- return c;
- }
- NUM mult(NUM a, NUM b) {
- NUM ans, t;
- int digits = 0;
- while(b.data[digits] == 0) digits++;
- for(int i = maxSize - 1; i >= maxSize - digits; i-- ) {
- t = multShort(a, b.data[i]);
- ans = sum(ans, t);
- a = mult10(a);
- }
- if(a.sign == b.sign) {
- ans.sign = 1;
- } else {
- ans.sign = -1;
- }
- return ans;
- }
- NUM zero() {
- NUM a;
- for (int i = 0; i < maxSize; i++)
- a.data[i] = 0;
- return a;
- }
- NUM one() {
- NUM a = zero();
- a.data[maxSize - 1] = 1;
- return a;
- }
- bool isZero(NUM a) {
- for (int i = 0; i < maxSize; i++) {
- if (a.data[i] != 0) return false;
- }
- return true;
- }
- bool isOne(NUM a) {
- for (int i = 0; i < maxSize - 1; i++) {
- if (a.data[i] != 0) return false;
- }
- return (a.data[maxSize - 1] == 1);
- }
- NUM divByTwo(NUM a) {
- for (int i = 0; i < maxSize; i++) {
- if (i + 1 < maxSize)
- a.data[i + 1] += 10 * (a.data[i] % 2);
- a.data[i] /= 2;
- }
- return a;
- }
- NUM div(NUM a, NUM b) {
- NUM c;
- int cmp = compareNum(a,b);
- if(isZero(a)) {
- return zero();
- }
- if(cmp == 0) {
- return one();
- }
- if(isOne(b)) {
- return a;
- }
- NUM rB = a, lB = one(), mid, prevC = zero();
- do {
- prevC = mid;
- mid = divByTwo(sum(rB, lB));
- NUM res = mult(b, mid);
- printNum(res);
- cout << endl;
- cmp = compareNum (a,res);
- if(cmp == 1) {
- lB = mid;
- } else {
- rB = mid;
- }
- } while(cmp && compareNum(mid, prevC));
- if(a.sign == b.sign) {
- mid.sign = 1;
- } else {
- mid.sign = -1;
- }
- return mid;
- }
- int main() {
- NUM a = convertToNum("1902");
- NUM b = convertToNum("112");
- NUM c = diff(a, b);
- NUM d = sum(a, b);
- NUM f = mult(a, b);
- NUM e = div(a, b);
- printNum(a);
- cout << " - ";
- printNum(b);
- cout << " = ";
- printNum(c);
- cout<<endl;
- cout<<"----------------------"<<endl;
- printNum(a);
- cout << " + ";
- printNum(b);
- cout << " = ";
- printNum(d);
- cout<<endl;
- cout<<"----------------------"<<endl;
- printNum(a);
- cout<<" * ";
- printNum(b);
- cout<<" = ";
- printNum(f);
- cout<<endl;
- cout<<"----------------------"<<endl;
- printNum(a);
- cout<<" / ";
- printNum(b);
- cout<<" = ";
- printNum(e);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement