-1

From this post: Compare two string as numeric value I did not get a result. Please open this post so that someone can answer my question.

I wrote this library (pr.h):

#include <iostream>
#include <string>
#include <bits/stdc++.h>
using namespace std;
class BigNum {
    private:
    string doSum(string a, string b)
    {
       if(a.size() < b.size())
           swap(a, b);
   
       int j = a.size()-1;
       for(int i=b.size()-1; i>=0; i--, j--)
           a[j]+=(b[i]-'0');
   
       for(int i=a.size()-1; i>0; i--)
       {
           if(a[i] > '9')
           {
               int d = a[i]-'0';
               a[i-1] = ((a[i-1]-'0') + d/10) + '0';
               a[i] = (d%10)+'0';
           }
       }
       if(a[0] > '9')
       {
           string k;
           k+=a[0];
           a[0] = ((a[0]-'0')%10)+'0';
           k[0] = ((k[0]-'0')/10)+'0';
           a = k+a;
       }
       return a;
    }
    bool isSmaller(string str1, string str2)
{
    int n1 = str1.length(), n2 = str2.length();
 
    if (n1 < n2)
        return true;
    if (n2 < n1)
        return false;
 
    for (int i = 0; i < n1; i++) {
        if (str1[i] < str2[i])
            return true;
        else if (str1[i] > str2[i])
            return false;
    }
    return false;
}
string findDiff(string str1, string str2)
{
    if (isSmaller(str1, str2))
        swap(str1, str2);
 
    string str = "";

    int n1 = str1.length(), n2 = str2.length();
    int diff = n1 - n2;
    int carry = 0;
 
    for (int i = n2 - 1; i >= 0; i--) {
        int sub = ((str1[i + diff] - '0') - (str2[i] - '0')
                   - carry);
        if (sub < 0) {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
 
        str.push_back(sub + '0');
    }
 
    for (int i = n1 - n2 - 1; i >= 0; i--) {
        if (str1[i] == '0' && carry) {
            str.push_back('9');
            continue;
        }
        int sub = ((str1[i] - '0') - carry);
        if (i > 0 || sub > 0)
            str.push_back(sub + '0');
        carry = 0;
    }
    reverse(str.begin(), str.end());
 
    return str;
}
    public:
    string num;
    BigNum () {
        num = "";
    }
    BigNum (string tmp) {
      num = tmp;
    }
    string operator +(BigNum a1) {
        return doSum(this->num,a1.num);
    }
    void operator = (BigNum * a1) {
        this-> num = a1-> num;
    }
    void operator = (string tmp) {
        this-> num = tmp;
    }
    bool operator > (BigNum a1) {
        if (this->num>a1.num){
            return true;
        }
        else{
            return false;
        }
    }
    bool operator < (BigNum a1) {
        if (this->num<a1.num){
            return true;
        }
        else{
            return false;
        }
    }
    string operator - (BigNum a1) {
        return findDiff(this->num, a1.num);
    }
    friend ostream &operator<<( ostream &output, const BigNum &D ) { 
         output << D.num;
         return output;            
    }
    friend istream &operator>>( istream  &input, BigNum &D ) { 
         input >> D.num;
         return input;            
    }
    string operator -=(string tmp){
        this->num=findDiff(this->num, tmp);
        return this->num;
    }

};

And this code:


// C++ program for implementation of Bubble sort
#include "pr.h"
#include <bits/stdc++.h>
using namespace std;
 
void swap(BigNum *xp, BigNum *yp)
{
    BigNum temp = *xp;
    *xp = *yp;
    *yp = temp;
}
 
// A function to implement bubble sort
void bubbleSort(BigNum arr[], int n)
{
    int i, j;
    for (i = 0; i < n-1; i++)    
     
    // Last i elements are already in place
    for (j = 0; j < n-i-1; j++)
        if (arr[j] > arr[j+1])
            swap(&arr[j], &arr[j+1]);
}
 
/* Function to print an array */
void printArray(BigNum arr[], int size)
{
    int i;
    for (i = 0; i < size; i++)
        cout << arr[i] << " ";
    cout << endl;
}
 
// Driver code
int main()
{
    BigNum arr[5];
    arr[0]="5";
    arr[1]="5";
    arr[2]="1";
    arr[3]="3";
    arr[4]="8";
    int n = sizeof(arr)/sizeof(arr[0]);
    bubbleSort(arr, n);
    cout<<"Sorted array: \n";
    printArray(arr, n);
    return 0;
}

My problem is that this program can only sort 1-digit numbers and gives errors for multi-digit numbers Example: This code:

     BigNum arr [5];
     arr [0] = "100";
     arr [1] = "5";
     arr [2] = "1";
     arr [3] = "3";
     arr [4] = "8";
     int n = sizeof (arr) / sizeof (arr [0]);
     bubbleSort (arr, n);
     cout << "Sorted array: \ n";
     printArray (arr, n);

Prints this value:

1 100 3 5 8
pzaenger
  • 11,381
  • 3
  • 45
  • 46
smartnima
  • 35
  • 8
  • Your code is well segmented in small functions, so it's a perfect candidate for unit testing. Check that each individual function works before looking into issues with the larger algorithm. (hint: `assert( BigNum("8") < BigNum("50"));` –  Jul 17 '21 at 16:54
  • 1
    You've written `bool isSmaller` that attempts to implement the method described in the linked question. But then you don't actually call that function in `operator<`, which just compares the strings lexicographically. – Nathan Pierson Jul 17 '21 at 16:54
  • The answers at the question you linked are exactly what you need for your `operator>` and `operator<`. – Mark Ransom Jul 17 '21 at 16:56

1 Answers1

1

bool operator < (BigNum a1) is calling std::string:: operator<, thus you getting lexicographical order. The operators < and > should call isSmaller.

bool operator > (const BigNum& a1) const {
    return !isSmaller(a1) && num != a1.num;
}
bool operator < (const BigNum& a1) const {
    return isSmaller(a1);
}

Do not use constructions if (smth) return true else return false. You already get true or false in smth, use return smth.

273K
  • 29,503
  • 10
  • 41
  • 64