beefviper

better _total(), 1st draft

Sep 5th, 2018
135
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* total */
  2. BigNum BigNum::_total(const BigNum& _augend, const BigNum& _addend) {
  3.     BigNum sum;
  4.     sum.integer.clear();
  5.     sum.fraction.clear();
  6.  
  7.     int base = _augend.base;
  8.  
  9.  
  10.     int augIntLen = _augend.integer.size();
  11.     int augFracLen = _augend.fraction.size();
  12.     int addIntLen = _addend.integer.size();
  13.     int addFracLen = _addend.fraction.size();
  14.  
  15.     int maxIntLen = (augIntLen > addIntLen) ? augIntLen : addIntLen;
  16.     int maxFracLen = (augFracLen > addFracLen) ? augFracLen : addFracLen;
  17.     int minIntLen = (augIntLen < addIntLen) ? augIntLen : addIntLen;
  18.     int minFracLen = (augFracLen < addFracLen) ? augFracLen : addFracLen;
  19.  
  20.     int diffIntLen = maxIntLen - minIntLen;
  21.     int diffFracLen = maxFracLen - minFracLen;
  22.  
  23.     // copy extra part longer fraction part
  24.     if (augFracLen > addFracLen) {
  25.         for (int i = 0; i < diffFracLen; i++) {
  26.             sum.fraction.push_back(_augend.fraction.at(maxFracLen - i));
  27.         }
  28.     }
  29.     else if (addFracLen > augFracLen){
  30.         for (int i = 0; i < diffFracLen; i++) {
  31.             sum.fraction.push_back(_addend.fraction.at(maxFracLen - i));
  32.         }
  33.     }
  34.  
  35.     // add overlapping fraction part
  36.     int carry = 0;
  37.     int tempFrac = 0;
  38.  
  39.     for (int i = 0; i < minFracLen; i++) {
  40.         tempFrac = _augend.fraction.at(minFracLen - i - 1) + _addend.fraction.at(minFracLen - i - 1) + carry;
  41.         carry = 0;
  42.  
  43.         if (tempFrac > (base - 1)) {
  44.             tempFrac = tempFrac - base;
  45.             carry = 1;
  46.         }
  47.     }
  48.  
  49.     // add overlapping integer part
  50.     int tempInt;
  51.  
  52.     if (augIntLen > addIntLen) {
  53.         for (int i = 0; i < minIntLen; i++) {
  54.             tempInt = _augend.integer.at(minIntLen - i + diffIntLen - 1) + _addend.integer.at(minIntLen - i - 1) + carry;
  55.             carry = 0;
  56.  
  57.             if (tempInt > (base - 1)) {
  58.                 tempInt = tempInt - base;
  59.                 carry = 1;
  60.             }
  61.             sum.integer.push_back(tempInt);
  62.         }
  63.     }
  64.     else if (addIntLen > augIntLen) {
  65.         for (int i = 0; i < minIntLen; i++) {
  66.             tempInt = _augend.integer.at(minIntLen - i - 1) + _addend.integer.at(minIntLen - i + diffIntLen - 1) + carry;
  67.             carry = 0;
  68.  
  69.             if (tempInt > (base - 1)) {
  70.                 tempInt = tempInt - base;
  71.                 carry = 1;
  72.             }
  73.             sum.integer.push_back(tempInt);
  74.         }
  75.     }
  76.     else {
  77.         for (int i = 0; i < maxIntLen; i++) {
  78.             tempInt = _augend.integer.at(minIntLen - i - 1) + _addend.integer.at(minIntLen - i - 1) + carry;
  79.             carry = 0;
  80.  
  81.             if (tempInt > (base - 1)) {
  82.                 tempInt = tempInt - base;
  83.                 carry = 1;
  84.             }
  85.             sum.integer.push_back(tempInt);
  86.         }
  87.     }
  88.  
  89.     // copy extra part of longer integer part
  90.     if (augIntLen > addIntLen) {
  91.         for (int i = 0; i < diffIntLen; i++) {
  92.             tempInt = _augend.integer.at(diffIntLen - i - 1) + carry;
  93.             carry = 0;
  94.  
  95.             if (tempInt > (base - 1)) {
  96.                 tempInt = tempInt - base;
  97.                 carry = 1;
  98.             }
  99.             sum.integer.push_back(tempInt);
  100.         }
  101.     }
  102.     else if (addIntLen > augIntLen) {
  103.         for (int i = 0; i < diffIntLen; i++) {
  104.             tempInt = _addend.integer.at(diffIntLen - i - 1) + carry;
  105.             carry = 0;
  106.  
  107.             if (tempInt > (base - 1)) {
  108.                 tempInt = tempInt - base;
  109.                 carry = 1;
  110.             }
  111.             sum.integer.push_back(tempInt);
  112.         }
  113.     }
  114.  
  115.     if (carry == 1) {
  116.         sum.integer.push_back(1);
  117.     }
  118.  
  119.     std::reverse(sum.integer.begin(), sum.integer.end());
  120.     std::reverse(sum.fraction.begin(), sum.fraction.end());
  121.  
  122.     return sum;
  123. }
RAW Paste Data