Guest User

Untitled

a guest
Apr 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.72 KB | None | 0 0
  1. //
  2. //  bigInt.cpp
  3. //  CMPT 275 :: Lab 6
  4.  
  5.  
  6. #include "bigInt.h"
  7.  
  8. bigInt::bigInt() {
  9.  
  10.   int i;
  11.  
  12.    for(i = 0; i < SIZE; i++)   //Sets all the values of digits to 0.
  13.          digits[i] = 0;
  14.       sign = true;
  15.       numDigits = 1;
  16.      
  17.       error1 = true;
  18.       overflowFlag = false;
  19.        
  20. }
  21.  
  22.  
  23.  
  24.  
  25.  
  26. bigInt::bigInt(const char temp []) {
  27.  
  28.   int i;
  29.   int tempSize = strlen(temp);
  30.   numDigits = 1;
  31.   error1 = true;
  32.   sign = true;
  33.  
  34.   if(tempSize > 30)
  35.     error1 = false;
  36.  
  37.   if(temp[0] == '-') { //If there's a negative symbol set the sign to false
  38.     sign = false;
  39.    
  40.     if(tempSize > 31) //Add an extra space so the - doesn't count
  41.       error1 = false;
  42.    
  43.   for(i = 0; i < SIZE; i++){
  44.     if(i < tempSize - 1)
  45.       if ( !(temp[tempSize-i - 1] >= 48 && temp[tempSize-i - 1] <= 58)){ //Check for errors
  46.         error1 = false;
  47.       }
  48.       else {
  49.         digits[i] = temp[tempSize-i-1] - '0';
  50.         if(digits[i]!=0)
  51.           numDigits = i+1;
  52.            
  53.       }
  54.     else
  55.       digits[i] = 0;
  56.   }
  57.   }
  58.   else{
  59.  
  60.   for(i = 0; i < SIZE; i++){
  61.     if(i < tempSize)
  62.       if ( !(temp[tempSize-i-1] >= 48 && temp[tempSize-i-1] <= 58)){ //Check for errors
  63.         error1 = false;
  64.       }
  65.       else {
  66.         digits[i] = temp[tempSize-i-1] - '0';
  67.         if(digits[i]!=0)
  68.           numDigits = i+1;
  69.            
  70.       }
  71.     else
  72.       digits[i] = 0;
  73.   }
  74.  
  75.   }
  76.  
  77.  
  78. }
  79.  
  80.  
  81.  
  82.  
  83.  
  84. bigInt::bigInt(const string temp) {
  85.   int i;
  86.   int tempSize = temp.length();
  87.   numDigits = 1;
  88.   error1 = true;
  89.   sign = true;
  90.  
  91.  if(tempSize > 30)
  92.     error1 = false;
  93.  
  94.   if(temp[0] == '-') {//If there's a negative symbol set the sign to false
  95.     sign = false;
  96.    
  97.     if(tempSize > 31)//Add an extra space so the - doesn't count
  98.       error1 = false;
  99.    
  100.   for(i = 0; i < SIZE; i++){
  101.     if(i < tempSize - 1)
  102.       if ( !(temp[tempSize-i - 1] >= 48 && temp[tempSize-i - 1] <= 58)){ //Check for errors
  103.         error1 = false;
  104.       }
  105.       else {
  106.         digits[i] = temp[tempSize-i-1] - '0';
  107.         if(digits[i]!=0)
  108.           numDigits = i+1;
  109.            
  110.       }
  111.     else
  112.       digits[i] = 0;
  113.   }
  114.   }
  115.   else{
  116.  
  117.   for(i = 0; i < SIZE; i++){
  118.     if(i < tempSize)
  119.       if ( !(temp[tempSize-i-1] >=48 && temp[tempSize-i-1] <= 58) || temp[tempSize-i-1] == '-'  ){//Check for errors
  120.         error1 = false;
  121.           if(sign == false)
  122.             error1 = true;
  123.       }
  124.        
  125.       else {
  126.         digits[i] = temp[tempSize-i-1] - 48;
  127.        
  128.         if(digits[i]!=0)
  129.           numDigits = i+1;
  130.       }
  131.     else
  132.       digits[i] = 0;
  133.   }
  134.  
  135.   }
  136.  
  137. }
  138.  
  139.  
  140.  
  141.  
  142.  
  143. int bigInt::length() const {
  144.  
  145.     return numDigits; //Returns the number of digits
  146. }
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153. bool bigInt::overflow() const {
  154.  
  155.  
  156.  
  157.  
  158. return overflowFlag; //Overflow check
  159. }
  160.  
  161.  
  162.  
  163.  
  164.  
  165. bool bigInt::error() const {
  166.  
  167.  
  168.  
  169. return !error1;//Error checking
  170. }
  171.  
  172.  
  173.  
  174.  
  175.  
  176. bool bigInt::negative() const {
  177.  
  178. return !sign;//Sign checking
  179. }
  180.  
  181.  
  182.  
  183.  
  184.  
  185. string bigInt::toString() const {
  186.  
  187.  
  188.   string output = "";
  189. if(sign == false) //If there's a negative symbol it will be outputted
  190. output = "-";
  191.  
  192.   for(int i = numDigits - 1; i >= 0; i--) {
  193.     if ((i) % 3 == 2 && i < numDigits - 1)
  194.       output += ','; //Add commas
  195.     output += digits[i] + '0';
  196.   }
  197.  
  198.    
  199.  
  200. return output;
  201.  
  202.  
  203. }
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213. int bigInt::compare(const bigInt& x) const {
  214.  
  215. for(int i = SIZE - 1; i >= 0; i--){
  216.    
  217.      if(sign == false && x.sign == true)
  218.           return -1;
  219.             else if(x.sign == false && sign == true)
  220.              return 1;
  221.                 else if(sign == false && x.sign == false){
  222.                       if(digits[i] > x.digits[i])
  223.                          return -1;
  224.                            else if(digits[i] < x.digits[i])
  225.                               return 1;
  226.                               }
  227.                                 else if(digits[i] < x.digits[i])
  228.                                     return -1;
  229.                                         else if(digits[i] > x.digits[i])
  230.                                              return 1;
  231.          
  232. }
  233.           return 0;
  234. }
  235.  
  236.  
  237.  
  238.  
  239.  
  240. bigInt bigInt::add(const bigInt& x) const {
  241.  
  242.  
  243.   int carry = 0;
  244.   int i;
  245.   bigInt output;
  246.  
  247.  
  248.   for(i = 0; i < SIZE; i++) {
  249.     int value;
  250.    
  251.     if(sign == false && x.sign == false)
  252.        output.sign = false;
  253.  
  254.     value = digits[i] + x.digits[i] + carry;
  255.     carry = 0;
  256.     carry = value / 10;
  257.     output.digits[i] = value % 10;
  258.    
  259.     if(value != 0)
  260.       output.numDigits = i + 1;
  261.   }
  262.   if (output.numDigits == SIZE && carry){
  263.     output.overflowFlag = true;
  264.     output.numDigits = 1;
  265.     for (i = 0; i < SIZE; i++) {
  266.         if(output.digits[i] != 0)
  267.          output.numDigits=i+1;
  268.   }
  269.   }
  270.   return output;
  271.  
  272.  
  273.  
  274. }
  275.  
  276.  
  277.  
  278.  
  279.  
  280. bigInt bigInt::sub(const bigInt& x) const {
  281.  
  282.   int value;
  283.   int i;
  284.  
  285.   bigInt output;
  286.   bigInt temp;
  287.   cout << "X num digits = " << x.numDigits << endl;
  288.   cout << "Num digits = " << numDigits << endl;
  289.   for(i = 0; i < SIZE; i++) {
  290.  
  291.    
  292.     if(sign == false  && x.sign != false){
  293.      value = digits[i] +  x.digits[i];
  294.      output.sign = false;}
  295.       else if(x.sign == false && sign != false)
  296.              value = digits[i] +  x.digits[i];
  297.              
  298.   //  else if(digits[numDigits - 1] < x.digits[numDigits - 1] ){
  299.    //       output.sign = false;
  300.          
  301.     //         if(x.digits[i] < digits[i]){
  302.    //  value = (x.digits[i] + 10) - digits[i];
  303.   //      output.digits[i] = value;
  304.   //      output.digits[i + 1] = x.digits[i + 1] - 1;
  305.   //      }
  306.   //      else if(x.digits[i] >= digits[i]){
  307.   //      value = x.digits[i] - digits[i];
  308.   //      output.digits[i] = value;
  309.    //     }
  310.        
  311.    //     }
  312.    
  313. //    else if(digits[numDigits] < x.digits[x.numDigits - 1]){
  314.   //       output.sign = false;
  315.     //    
  316.       //   if(x.digits[i] < digits[i]){
  317.          
  318.      //value = x.digits[i] + 10  - digits[i];
  319.        // output.digits[i] = value;
  320.         //output.digits[i + 1] = x.digits[i + 1] - 1;
  321.  //       }
  322.    //     else if(x.digits[i] >= digits[i]){
  323.      //   value = x.digits[i] - digits[i];
  324.        // output.digits[i] = value;
  325.        // }
  326.        
  327.         //}
  328.          
  329.    else
  330.     if(digits[i] < x.digits[i]){
  331.    
  332.      value = (digits[i] + 10) - x.digits[i];
  333.         output.digits[i] = value;
  334.        output.digits[i + 1] = digits[i + 1] -1;
  335.        
  336.  
  337.         }
  338.  
  339.     else if(digits[i] >= x.digits[i]){
  340.  
  341.  
  342.        value = digits[i] - x.digits[i];
  343.        cout << "value" << value << endl;
  344.        output.digits[i] = value;}
  345.    
  346.    
  347.  
  348.    
  349.     if(value != 0)
  350.       output.numDigits = i + 1;
  351.      
  352.   }
  353.   if (output.numDigits == SIZE){
  354.     output.overflowFlag = true;
  355.     output.numDigits = 1;
  356.     for (i = 0; i < SIZE; i++) {
  357.         if(output.digits[i] != 0)
  358.          output.numDigits=i+1;
  359.   }
  360.   }
  361.   return output;
  362. }
Add Comment
Please, Sign In to add comment