天涯忘 发表于 2019-1-3 12:35:35

超长整数类

本帖最后由 天涯忘 于 2019-1-3 12:41 编辑

不能理解这段代码的基本原理具体是什么,求大佬帮具体讲解注释一下,谢谢








#include<iostream>
#include<cstring>
#define MAX 65*65
using namespace std;
class doublelong{
        char number;
public:
        doublelong(const char *str = " ")
        {
                strcpy(number, str);
        }
        void show()
        {
                cout << number << endl;
        }
        void operator>>(doublelong a)
        {
                cin >> number;
        }
        friend istream & operator>>(istream &is, doublelong &ob);
        friend ostream & operator<<(ostream &os, const doublelong &ob);
        friend doublelong operator+(doublelong &ob1, doublelong &ob2);
        friend doublelong operator-(doublelong &ob1, doublelong &ob2);
        friend doublelong operator*(doublelong &ob1, doublelong &ob2);
        friend doublelong operator/(doublelong &ob1, doublelong &ob2);
        void operator+=(doublelong &ob);
        void operator-=(doublelong &ob);
        void operator/=(doublelong &ob);
};
void sub(char str1[], char str2[], char result[])
{
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        if (len1<len2)
        {
                char temp;
                strcpy(temp, str1);
                strcpy(str1, str2);
                strcpy(str2, temp);
                int t = len1;
                len1 = len2;
                len2 = t;
        }
        int num1 = { 0 }, num2 = { 0 };
        int i;
        for (i = 0; i<len1; i++)
        {
                num1 = str1 - '0';
        }
        for (i = 0; i<len2; i++)
        {
                num2 = str2 - '0';
        }
        for (i = 0; i<len1 / 2; i++)
        {
                int temp = num1;
                num1 = num1;
                num1 = temp;
        }
        for (i = 0; i<len2 / 2; i++)
        {
                int temp = num2;
                num2 = num2;
                num2 = temp;
        }
        int len = len1>len2 ? len1 : len2;
        int ans = { 0 };
        for (i = 0; i<len; i++)
        {
                if (num1 - num2<0)
                {
                        ans = num1 + 10 - num2;
                        num1 -= 1;
                }
                else
                {
                        ans = num1 - num2;
                }
        }
        for (i = len - 1; i >= 0; i--)
        {
                if (ans != 0)
                        break;
        }
        if (i == -1)
                result = '0';
        else
        {
                int j;
                if (result != '-')
                        j = 0;
                else
                        j = 1;
                while (i >= 0)
                {
                        result = ans + '0';
                        j++;
                        i--;
                }
        }
}
void add(char str1[], char str2[], char result[])
{
        int num1 = { 0 }, num2 = { 0 };
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        int i;
        for (i = 0; i<len1; i++)
        {
                num1 = str1 - '0';
        }
        for (i = 0; i<len2; i++)
        {
                num2 = str2 - '0';
        }
        for (i = 0; i<len1 / 2; i++)
        {
                int temp = num1;
                num1 = num1;
                num1 = temp;
        }
        for (i = 0; i<len2 / 2; i++)
        {
                int temp = num2;
                num2 = num2;
                num2 = temp;
        }
        int len = len1>len2 ? len1 : len2;
        int ans = { 0 };
        for (i = 0; i<len; i++)
        {
                ans += num1 + num2;
                if (ans >= 10)
                {
                        ans += ans / 10;
                        ans = ans % 10;
                }
        }
        for (i = len; i >= 0; i--)
        {
                if (ans != 0)
                        break;
        }
        int j;
        if (result != '-')
                j = 0;
        else
                j = 1;
        while (i >= 0)
        {
                result = ans + '0';
                j++;
                i--;
        }
}
void multiply(char str1[], char str2[], char result[])
{
        int num1 = { 0 };
        int num2 = { 0 };
        int ans = { 0 };
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        int len = len1>len2 ? len1 : len2;
        int i, j;
        for (j = 0, i = len1 - 1; i >= 0; i--)
                num1 = str1 - '0';
        for (j = 0, i = len2 - 1; i >= 0; i--)
                num2 = str2 - '0';
        for (i = 0; i<len1; i++)
        {
                for (j = 0; j<len2; j++)
                        ans = ans + num1 * num2;
        }
        for (i = 0; i<len * 2; i++)
        {
                if (ans >= 10)
                {
                        ans = ans + ans / 10;
                        ans = ans % 10;
                }
        }
        for (i = len * 2; i>0; i--)
        {
                if (ans != 0)
                        break;
        }
        if (result != '-')
                j = 0;
        else
                j = 1;
        while (i >= 0)
        {
                result = ans + '0';
                j++;
                i--;
        }
}
int SubStract(int *p1, int *p2, int len1, int len2)
{
        int i;
        if (len1<len2)
                return -1;
        if (len1 == len2)
        {
                for (i = len1 - 1; i >= 0; i--)
                {
                        if (p1>p2)
                                break;
                        else if (p1<p2)
                                return -1;
                }
        }
        for (i = 0; i <= len1 - 1; i++)
        {
                p1 -= p2;
                if (p1<0)
                {
                        p1 += 10;
                        p1--;
                }
        }
        for (i = len1 - 1; i >= 0; i--)
                if (p1)
                        return i + 1;
        return 0;
}
void division(char str1[], char str2[], char result[])
{
        int i, j;
        int nTimes;
        int nTemp;
        int num1 = { 0 };
        int num2 = { 0 };
        int ans = { 0 };
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        for (j = 0, i = len1 - 1; i >= 0; j++, i--)
                num1 = str1 - '0';
        for (j = 0, i = len2 - 1; i >= 0; j++, i--)
                num2 = str2 - '0';
        if (len1<len2)
        {
                result = '0';
                return;
        }
        nTimes = len1 - len2;
        for (i = len1 - 1; i >= 0; i--)
        {
                if (i >= nTimes)
                        num2 = num2;
                else
                        num2 = 0;
        }
        len2 = len1;
        for (j = 0; j <= nTimes; j++)
        {
                while ((nTemp = SubStract(num1, num2 + j, len1, len2 - j)) >= 0)
                {
                        len1 = nTemp;
                        ans++;
                }
        }
        for (i = 9; i >= 0; i--)
        {
                if (ans != 0)
                        break;
        }
        if (result != '-')
                j = 0;
        else
                j = 1;
        while (i >= 0)
        {
                result = ans + '0';
                j++;
                i--;
        }
}
istream & operator>>(istream &is, doublelong &ob)
{
        is >> ob.number;
        return is;
}
ostream & operator<<(ostream &os, const doublelong &ob)
{
        os << ob.number;
        return os;
}
doublelong operator+(doublelong &ob1, doublelong &ob2)
{
        char result;
        char str1, str2;
        strcpy(str1, ob1.number);
        strcpy(str2, ob2.number);
        if (str1 == '-'&&str2 == '-')
        {
                result = '-';
                add(str1 + 1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1 + 1, str2)>0)
                        {
                                result = '-';
                                sub(str1 + 1, str2, result);
                        }
                        else
                        {
                                sub(str2, str1 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2, result);
                }
                else
                {
                        sub(str1 + 1, str2, result);
                }
        }
        else if (str1 != '-'&&str2 == '-')
        {
                int len1 = strlen(str1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2 + 1)>0)
                        {
                                sub(str1, str2 + 1, result);
                        }
                        else
                        {
                                result = '-';
                                sub(str2 + 1, str1, result);
                        }
                }
                else if (len1<len2)
                {
                        result='-';
                        sub(str1, str2 + 1, result);
                }
                else
                {
                        sub(str1, str2 + 1, result);
                }
        }
        else if (str1 != '-'&&str2 != '-')
        {
                add(str1, str2, result);
        }
        return doublelong(result);
}
doublelong operator-(doublelong &ob1, doublelong &ob2)
{
        char result;
        char str1, str2;
        strcpy(str1, ob1.number);
        strcpy(str2, ob2.number);
        if (str1 != '-'&&str2 == '-')
        {
                add(str1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                result = '-';
                add(str1 + 1, str2, result);
        }
        else if (str1 != '-'&&str2 != '-')
        {
                int len1 = strlen(str1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2)>0)
                        {
                                sub(str1, str2, result);
                        }
                        else
                        {
                                result = '-';
                                sub(str2, str1, result);
                        }
                }
                else if (len1>len2)
                {
                        sub(str1, str2, result);
                }
                else
                {
                        result = '-';
                        sub(str1, str2, result);
                }
        }
        else
        {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str2 + 1, str1 + 1) >= 0)
                        {
                                sub(str2 + 1, str1 + 1, result);
                        }
                        else
                        {
                                result = '-';
                                sub(str1 + 1, str2 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2 + 1, result);
                }
                else
                {
                        sub(str1 + 1, str2 + 1, result);
                }
        }
        return doublelong(result);
}
doublelong operator*(doublelong &ob1, doublelong &ob2)
{
        char result;
        char str1, str2;
        strcpy(str1, ob1.number);
        strcpy(str2, ob2.number);
        if (strcmp(str1, "0") == 0 || strcmp(str2, "0") == 0)
        {
                return doublelong("0");
        }
        if (str1 != '-'&&str2 == '-')
        {
                result = '-';
                multiply(str1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                result = '-';
                multiply(str1 + 1, str2, result);
        }
        else if (str1 == '-'&&str2 == '-')
        {
                multiply(str1 + 1, str2 + 1, result);
        }
        else
        {
                multiply(str1, str2, result);
        }
        return doublelong(result);
}
doublelong operator/(doublelong &ob1, doublelong &ob2)
{
        char result;
        char str1, str2;
        strcpy(str1, ob1.number);
        strcpy(str2, ob2.number);
        if (str1 != '-'&&str2 == '-')
        {
                result = '-';
                division(str1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                result = '-';
                division(str1 + 1, str2, result);
        }
        else if (str1 == '-'&&str2 == '-')
        {
                division(str1 + 1, str2 + 1, result);
        }
        else
        {
                division(str1, str2, result);
        }
        return doublelong(result);
}
void doublelong::operator+=(doublelong &ob)
{
        char result;
        char str1, str2;
        strcpy(str1, this->number);
        strcpy(str2, ob.number);
        if (str1 == '-'&&str2 == '-')
        {
                result = '-';
                add(str1 + 1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1 + 1, str2)>0)
                        {
                                result = '-';
                                sub(str1 + 1, str2, result);
                        }
                        else
                        {
                                sub(str2, str1 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2, result);
                }
                else
                {
                        sub(str1 + 1, str2, result);
                }
        }
        else if (str1 != '-'&&str2 == '-')
        {
                int len1 = strlen(str1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2 + 1)>0)
                        {
                                sub(str1, str2 + 1, result);
                        }
                        else
                        {
                                result = '-';
                                sub(str2 + 1, str1, result);
                        }
                }
                else if (len1<len2)
                {
                        result='-';
                        sub(str1, str2 + 1, result);
                }
                else
                {
                        sub(str1, str2 + 1, result);
                }
        }
        else if (str1 != '-'&&str2 != '-')
        {
                add(str1, str2, result);
        }
        strcpy(this->number, result);
}
void doublelong::operator-=(doublelong &ob)
{
        char result;
        char str1, str2;
        strcpy(str1, this->number);
        strcpy(str2, ob.number);
        if (str1 != '-'&&str2 == '-')
        {
                add(str1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                result = '-';
                add(str1 + 1, str2, result);
        }
        else if (str1 != '-'&&str2 != '-')
        {
                int len1 = strlen(str1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2)>0)
                        {
                                sub(str1, str2, result);
                        }
                        else
                        {
                                result = '-';
                                sub(str2, str1, result);
                        }
                }
                else if (len1>len2)
                {
                        sub(str1, str2, result);
                }
                else
                {
                        result = '-';
                        sub(str1, str2, result);
                }
        }
        else
        {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str2 + 1, str1 + 1) >= 0)
                        {
                                sub(str2 + 1, str1 + 1, result);
                        }
                        else
                        {
                                result = '-';
                                sub(str1 + 1, str2 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2 + 1, result);
                }
                else
                {
                        sub(str1 + 1, str2 + 1, result);
                }
        }
        strcpy(this->number, result);
}
void doublelong::operator/=(doublelong &ob)
{
        char result;
        char str1, str2;
        strcpy(str1, this->number);
        strcpy(str2, ob.number);
        if (str1 != '-'&&str2 == '-')
        {
                result = '-';
                division(str1, str2 + 1, result);
        }
        else if (str1 == '-'&&str2 != '-')
        {
                result = '-';
                division(str1 + 1, str2, result);
        }
        else if (str1 == '-'&&str2 == '-')
        {
                division(str1 + 1, str2 + 1, result);
        }
        else
        {
                division(str1, str2, result);
        }
        strcpy(this->number, result);
}
int main()
{
        doublelong a = "100", b = "-7", c;
        c = a*b;
        cout << c << endl;
        c = "0";
        cout << c << endl;
        return 0;
}

TCY 发表于 2019-1-3 13:25:22

本帖最后由 TCY 于 2019-1-3 13:26 编辑

用代码格式:
#include<iostream>
#include<cstring>
#define MAX 65*65
using namespace std;
class doublelong{
      char number;
public:
      doublelong(const char *str = " ")
      {
                strcpy(number, str);
      }
      void show()
      {
                cout << number << endl;
      }
      void operator>>(doublelong a)
      {
                cin >> number;
      }
      friend istream & operator>>(istream &is, doublelong &ob);
      friend ostream & operator<<(ostream &os, const doublelong &ob);
      friend doublelong operator+(doublelong &ob1, doublelong &ob2);
      friend doublelong operator-(doublelong &ob1, doublelong &ob2);
      friend doublelong operator*(doublelong &ob1, doublelong &ob2);
      friend doublelong operator/(doublelong &ob1, doublelong &ob2);
      void operator+=(doublelong &ob);
      void operator-=(doublelong &ob);
      void operator/=(doublelong &ob);
};
void sub(char str1[], char str2[], char result[])
{
      int len1 = strlen(str1);
      int len2 = strlen(str2);
      if (len1<len2)
      {
                char temp;
                strcpy(temp, str1);
                strcpy(str1, str2);
                strcpy(str2, temp);
                int t = len1;
                len1 = len2;
                len2 = t;
      }
      int num1 = { 0 }, num2 = { 0 };
      int i;
      for (i = 0; i<len1; i++)
      {
                num1 = str1 - '0';
      }
      for (i = 0; i<len2; i++)
      {
                num2 = str2 - '0';
      }
      for (i = 0; i<len1 / 2; i++)
      {
                int temp = num1;
                num1 = num1;
                num1 = temp;
      }
      for (i = 0; i<len2 / 2; i++)
      {
                int temp = num2;
                num2 = num2;
                num2 = temp;
      }
      int len = len1>len2 ? len1 : len2;
      int ans = { 0 };
      for (i = 0; i<len; i++)
      {
                if (num1 - num2<0)
                {
                        ans = num1 + 10 - num2;
                        num1 -= 1;
                }
                else
                {
                        ans = num1 - num2;
                }
      }
      for (i = len - 1; i >= 0; i--)
      {
                if (ans != 0)
                        break;
      }
      if (i == -1)
                result = '0';
      else
      {
                int j;
                if (result != '-')
                        j = 0;
                else
                        j = 1;
                while (i >= 0)
                {
                        result = ans + '0';
                        j++;
                        i--;
                }
      }
}
void add(char str1[], char str2[], char result[])
{
      int num1 = { 0 }, num2 = { 0 };
      int len1 = strlen(str1);
      int len2 = strlen(str2);
      int i;
      for (i = 0; i<len1; i++)
      {
                num1 = str1 - '0';
      }
      for (i = 0; i<len2; i++)
      {
                num2 = str2 - '0';
      }
      for (i = 0; i<len1 / 2; i++)
      {
                int temp = num1;
                num1 = num1;
                num1 = temp;
      }
      for (i = 0; i<len2 / 2; i++)
      {
                int temp = num2;
                num2 = num2;
                num2 = temp;
      }
      int len = len1>len2 ? len1 : len2;
      int ans = { 0 };
      for (i = 0; i<len; i++)
      {
                ans += num1 + num2;
                if (ans >= 10)
                {
                        ans += ans / 10;
                        ans = ans % 10;
                }
      }
      for (i = len; i >= 0; i--)
      {
                if (ans != 0)
                        break;
      }
      int j;
      if (result != '-')
                j = 0;
      else
                j = 1;
      while (i >= 0)
      {
                result = ans + '0';
                j++;
                i--;
      }
}
void multiply(char str1[], char str2[], char result[])
{
      int num1 = { 0 };
      int num2 = { 0 };
      int ans = { 0 };
      int len1 = strlen(str1);
      int len2 = strlen(str2);
      int len = len1>len2 ? len1 : len2;
      int i, j;
      for (j = 0, i = len1 - 1; i >= 0; i--)
                num1 = str1 - '0';
      for (j = 0, i = len2 - 1; i >= 0; i--)
                num2 = str2 - '0';
      for (i = 0; i<len1; i++)
      {
                for (j = 0; j<len2; j++)
                        ans = ans + num1 * num2;
      }
      for (i = 0; i<len * 2; i++)
      {
                if (ans >= 10)
                {
                        ans = ans + ans / 10;
                        ans = ans % 10;
                }
      }
      for (i = len * 2; i>0; i--)
      {
                if (ans != 0)
                        break;
      }
      if (result != '-')
                j = 0;
      else
                j = 1;
      while (i >= 0)
      {
                result = ans + '0';
                j++;
                i--;
      }
}
int SubStract(int *p1, int *p2, int len1, int len2)
{
      int i;
      if (len1<len2)
                return -1;
      if (len1 == len2)
      {
                for (i = len1 - 1; i >= 0; i--)
                {
                        if (p1>p2)
                              break;
                        else if (p1<p2)
                              return -1;
                }
      }
      for (i = 0; i <= len1 - 1; i++)
      {
                p1 -= p2;
                if (p1<0)
                {
                        p1 += 10;
                        p1--;
                }
      }
      for (i = len1 - 1; i >= 0; i--)
                if (p1)
                        return i + 1;
      return 0;
}
void division(char str1[], char str2[], char result[])
{
      int i, j;
      int nTimes;
      int nTemp;
      int num1 = { 0 };
      int num2 = { 0 };
      int ans = { 0 };
      int len1 = strlen(str1);
      int len2 = strlen(str2);
      for (j = 0, i = len1 - 1; i >= 0; j++, i--)
                num1 = str1 - '0';
      for (j = 0, i = len2 - 1; i >= 0; j++, i--)
                num2 = str2 - '0';
      if (len1<len2)
      {
                result = '0';
                return;
      }
      nTimes = len1 - len2;
      for (i = len1 - 1; i >= 0; i--)
      {
                if (i >= nTimes)
                        num2 = num2;
                else
                        num2 = 0;
      }
      len2 = len1;
      for (j = 0; j <= nTimes; j++)
      {
                while ((nTemp = SubStract(num1, num2 + j, len1, len2 - j)) >= 0)
                {
                        len1 = nTemp;
                        ans++;
                }
      }
      for (i = 9; i >= 0; i--)
      {
                if (ans != 0)
                        break;
      }
      if (result != '-')
                j = 0;
      else
                j = 1;
      while (i >= 0)
      {
                result = ans + '0';
                j++;
                i--;
      }
}
istream & operator>>(istream &is, doublelong &ob)
{
      is >> ob.number;
      return is;
}
ostream & operator<<(ostream &os, const doublelong &ob)
{
      os << ob.number;
      return os;
}
doublelong operator+(doublelong &ob1, doublelong &ob2)
{
      char result;
      char str1, str2;
      strcpy(str1, ob1.number);
      strcpy(str2, ob2.number);
      if (str1 == '-'&&str2 == '-')
      {
                result = '-';
                add(str1 + 1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1 + 1, str2)>0)
                        {
                              result = '-';
                              sub(str1 + 1, str2, result);
                        }
                        else
                        {
                              sub(str2, str1 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2, result);
                }
                else
                {
                        sub(str1 + 1, str2, result);
                }
      }
      else if (str1 != '-'&&str2 == '-')
      {
                int len1 = strlen(str1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2 + 1)>0)
                        {
                              sub(str1, str2 + 1, result);
                        }
                        else
                        {
                              result = '-';
                              sub(str2 + 1, str1, result);
                        }
                }
                else if (len1<len2)
                {
                        result='-';
                        sub(str1, str2 + 1, result);
                }
                else
                {
                        sub(str1, str2 + 1, result);
                }
      }
      else if (str1 != '-'&&str2 != '-')
      {
                add(str1, str2, result);
      }
      return doublelong(result);
}
doublelong operator-(doublelong &ob1, doublelong &ob2)
{
      char result;
      char str1, str2;
      strcpy(str1, ob1.number);
      strcpy(str2, ob2.number);
      if (str1 != '-'&&str2 == '-')
      {
                add(str1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                result = '-';
                add(str1 + 1, str2, result);
      }
      else if (str1 != '-'&&str2 != '-')
      {
                int len1 = strlen(str1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2)>0)
                        {
                              sub(str1, str2, result);
                        }
                        else
                        {
                              result = '-';
                              sub(str2, str1, result);
                        }
                }
                else if (len1>len2)
                {
                        sub(str1, str2, result);
                }
                else
                {
                        result = '-';
                        sub(str1, str2, result);
                }
      }
      else
      {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str2 + 1, str1 + 1) >= 0)
                        {
                              sub(str2 + 1, str1 + 1, result);
                        }
                        else
                        {
                              result = '-';
                              sub(str1 + 1, str2 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2 + 1, result);
                }
                else
                {
                        sub(str1 + 1, str2 + 1, result);
                }
      }
      return doublelong(result);
}
doublelong operator*(doublelong &ob1, doublelong &ob2)
{
      char result;
      char str1, str2;
      strcpy(str1, ob1.number);
      strcpy(str2, ob2.number);
      if (strcmp(str1, "0") == 0 || strcmp(str2, "0") == 0)
      {
                return doublelong("0");
      }
      if (str1 != '-'&&str2 == '-')
      {
                result = '-';
                multiply(str1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                result = '-';
                multiply(str1 + 1, str2, result);
      }
      else if (str1 == '-'&&str2 == '-')
      {
                multiply(str1 + 1, str2 + 1, result);
      }
      else
      {
                multiply(str1, str2, result);
      }
      return doublelong(result);
}
doublelong operator/(doublelong &ob1, doublelong &ob2)
{
      char result;
      char str1, str2;
      strcpy(str1, ob1.number);
      strcpy(str2, ob2.number);
      if (str1 != '-'&&str2 == '-')
      {
                result = '-';
                division(str1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                result = '-';
                division(str1 + 1, str2, result);
      }
      else if (str1 == '-'&&str2 == '-')
      {
                division(str1 + 1, str2 + 1, result);
      }
      else
      {
                division(str1, str2, result);
      }
      return doublelong(result);
}
void doublelong::operator+=(doublelong &ob)
{
      char result;
      char str1, str2;
      strcpy(str1, this->number);
      strcpy(str2, ob.number);
      if (str1 == '-'&&str2 == '-')
      {
                result = '-';
                add(str1 + 1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1 + 1, str2)>0)
                        {
                              result = '-';
                              sub(str1 + 1, str2, result);
                        }
                        else
                        {
                              sub(str2, str1 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2, result);
                }
                else
                {
                        sub(str1 + 1, str2, result);
                }
      }
      else if (str1 != '-'&&str2 == '-')
      {
                int len1 = strlen(str1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2 + 1)>0)
                        {
                              sub(str1, str2 + 1, result);
                        }
                        else
                        {
                              result = '-';
                              sub(str2 + 1, str1, result);
                        }
                }
                else if (len1<len2)
                {
                        result='-';
                        sub(str1, str2 + 1, result);
                }
                else
                {
                        sub(str1, str2 + 1, result);
                }
      }
      else if (str1 != '-'&&str2 != '-')
      {
                add(str1, str2, result);
      }
      strcpy(this->number, result);
}
void doublelong::operator-=(doublelong &ob)
{
      char result;
      char str1, str2;
      strcpy(str1, this->number);
      strcpy(str2, ob.number);
      if (str1 != '-'&&str2 == '-')
      {
                add(str1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                result = '-';
                add(str1 + 1, str2, result);
      }
      else if (str1 != '-'&&str2 != '-')
      {
                int len1 = strlen(str1);
                int len2 = strlen(str2);
                if (len1 == len2)
                {
                        if (strcmp(str1, str2)>0)
                        {
                              sub(str1, str2, result);
                        }
                        else
                        {
                              result = '-';
                              sub(str2, str1, result);
                        }
                }
                else if (len1>len2)
                {
                        sub(str1, str2, result);
                }
                else
                {
                        result = '-';
                        sub(str1, str2, result);
                }
      }
      else
      {
                int len1 = strlen(str1 + 1);
                int len2 = strlen(str2 + 1);
                if (len1 == len2)
                {
                        if (strcmp(str2 + 1, str1 + 1) >= 0)
                        {
                              sub(str2 + 1, str1 + 1, result);
                        }
                        else
                        {
                              result = '-';
                              sub(str1 + 1, str2 + 1, result);
                        }
                }
                else if (len1>len2)
                {
                        result = '-';
                        sub(str1 + 1, str2 + 1, result);
                }
                else
                {
                        sub(str1 + 1, str2 + 1, result);
                }
      }
      strcpy(this->number, result);
}
void doublelong::operator/=(doublelong &ob)
{
      char result;
      char str1, str2;
      strcpy(str1, this->number);
      strcpy(str2, ob.number);
      if (str1 != '-'&&str2 == '-')
      {
                result = '-';
                division(str1, str2 + 1, result);
      }
      else if (str1 == '-'&&str2 != '-')
      {
                result = '-';
                division(str1 + 1, str2, result);
      }
      else if (str1 == '-'&&str2 == '-')
      {
                division(str1 + 1, str2 + 1, result);
      }
      else
      {
                division(str1, str2, result);
      }
      strcpy(this->number, result);
}
int main()
{
      doublelong a = "100", b = "-7", c;
      c = a*b;
      cout << c << endl;
      c = "0";
      cout << c << endl;
      return 0;
}
这个应该是把字符串变成数字运算

天涯忘 发表于 2019-1-3 13:52:30

TCY 发表于 2019-1-3 13:25
用代码格式:

这个应该是把字符串变成数字运算

我想知道四则运算的算法具体每一步是啥意思,能否注释一下?

DAY 发表于 2019-1-3 18:29:10

写代码的应该该批,这么长的代码一点注释都没有,
页: [1]
查看完整版本: 超长整数类