鱼C论坛

 找回密码
 立即注册
查看: 1392|回复: 3

超长整数类

[复制链接]
发表于 2019-1-3 12:35:35 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 天涯忘 于 2019-1-3 12:41 编辑

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








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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-3 13:25:22 | 显示全部楼层
本帖最后由 TCY 于 2019-1-3 13:26 编辑

用代码格式:
  1. #include<iostream>
  2. #include<cstring>
  3. #define MAX 65*65
  4. using namespace std;
  5. class doublelong{
  6.         char number[MAX];
  7. public:
  8.         doublelong(const char *str = " ")
  9.         {
  10.                 strcpy(number, str);
  11.         }
  12.         void show()
  13.         {
  14.                 cout << number << endl;
  15.         }
  16.         void operator>>(doublelong a)
  17.         {
  18.                 cin >> number;
  19.         }
  20.         friend istream & operator>>(istream &is, doublelong &ob);
  21.         friend ostream & operator<<(ostream &os, const doublelong &ob);
  22.         friend doublelong operator+(doublelong &ob1, doublelong &ob2);
  23.         friend doublelong operator-(doublelong &ob1, doublelong &ob2);
  24.         friend doublelong operator*(doublelong &ob1, doublelong &ob2);
  25.         friend doublelong operator/(doublelong &ob1, doublelong &ob2);
  26.         void operator+=(doublelong &ob);
  27.         void operator-=(doublelong &ob);
  28.         void operator/=(doublelong &ob);
  29. };
  30. void sub(char str1[], char str2[], char result[])
  31. {
  32.         int len1 = strlen(str1);
  33.         int len2 = strlen(str2);
  34.         if (len1<len2)
  35.         {
  36.                 char temp[MAX];
  37.                 strcpy(temp, str1);
  38.                 strcpy(str1, str2);
  39.                 strcpy(str2, temp);
  40.                 int t = len1;
  41.                 len1 = len2;
  42.                 len2 = t;
  43.         }
  44.         int num1[MAX] = { 0 }, num2[MAX] = { 0 };
  45.         int i;
  46.         for (i = 0; i<len1; i++)
  47.         {
  48.                 num1 = str1 - '0';
  49.         }
  50.         for (i = 0; i<len2; i++)
  51.         {
  52.                 num2 = str2 - '0';
  53.         }
  54.         for (i = 0; i<len1 / 2; i++)
  55.         {
  56.                 int temp = num1;
  57.                 num1 = num1[len1 - 1 - i];
  58.                 num1[len1 - 1 - i] = temp;
  59.         }
  60.         for (i = 0; i<len2 / 2; i++)
  61.         {
  62.                 int temp = num2;
  63.                 num2 = num2[len2 - 1 - i];
  64.                 num2[len2 - 1 - i] = temp;
  65.         }
  66.         int len = len1>len2 ? len1 : len2;
  67.         int ans[10] = { 0 };
  68.         for (i = 0; i<len; i++)
  69.         {
  70.                 if (num1 - num2<0)
  71.                 {
  72.                         ans = num1 + 10 - num2;
  73.                         num1[i + 1] -= 1;
  74.                 }
  75.                 else
  76.                 {
  77.                         ans = num1 - num2;
  78.                 }
  79.         }
  80.         for (i = len - 1; i >= 0; i--)
  81.         {
  82.                 if (ans != 0)
  83.                         break;
  84.         }
  85.         if (i == -1)
  86.                 result[0] = '0';
  87.         else
  88.         {
  89.                 int j;
  90.                 if (result[0] != '-')
  91.                         j = 0;
  92.                 else
  93.                         j = 1;
  94.                 while (i >= 0)
  95.                 {
  96.                         result[j] = ans + '0';
  97.                         j++;
  98.                         i--;
  99.                 }
  100.         }
  101. }
  102. void add(char str1[], char str2[], char result[])
  103. {
  104.         int num1[MAX] = { 0 }, num2[MAX] = { 0 };
  105.         int len1 = strlen(str1);
  106.         int len2 = strlen(str2);
  107.         int i;
  108.         for (i = 0; i<len1; i++)
  109.         {
  110.                 num1 = str1 - '0';
  111.         }
  112.         for (i = 0; i<len2; i++)
  113.         {
  114.                 num2 = str2 - '0';
  115.         }
  116.         for (i = 0; i<len1 / 2; i++)
  117.         {
  118.                 int temp = num1;
  119.                 num1 = num1[len1 - 1 - i];
  120.                 num1[len1 - 1 - i] = temp;
  121.         }
  122.         for (i = 0; i<len2 / 2; i++)
  123.         {
  124.                 int temp = num2;
  125.                 num2 = num2[len2 - 1 - i];
  126.                 num2[len2 - 1 - i] = temp;
  127.         }
  128.         int len = len1>len2 ? len1 : len2;
  129.         int ans[MAX] = { 0 };
  130.         for (i = 0; i<len; i++)
  131.         {
  132.                 ans += num1 + num2;
  133.                 if (ans >= 10)
  134.                 {
  135.                         ans[i + 1] += ans / 10;
  136.                         ans = ans % 10;
  137.                 }
  138.         }
  139.         for (i = len; i >= 0; i--)
  140.         {
  141.                 if (ans != 0)
  142.                         break;
  143.         }
  144.         int j;
  145.         if (result[0] != '-')
  146.                 j = 0;
  147.         else
  148.                 j = 1;
  149.         while (i >= 0)
  150.         {
  151.                 result[j] = ans + '0';
  152.                 j++;
  153.                 i--;
  154.         }
  155. }
  156. void multiply(char str1[], char str2[], char result[])
  157. {
  158.         int num1[MAX] = { 0 };
  159.         int num2[MAX] = { 0 };
  160.         int ans[MAX] = { 0 };
  161.         int len1 = strlen(str1);
  162.         int len2 = strlen(str2);
  163.         int len = len1>len2 ? len1 : len2;
  164.         int i, j;
  165.         for (j = 0, i = len1 - 1; i >= 0; i--)
  166.                 num1[j++] = str1 - '0';
  167.         for (j = 0, i = len2 - 1; i >= 0; i--)
  168.                 num2[j++] = str2 - '0';
  169.         for (i = 0; i<len1; i++)
  170.         {
  171.                 for (j = 0; j<len2; j++)
  172.                         ans[i + j] = ans[i + j] + num1 * num2[j];
  173.         }
  174.         for (i = 0; i<len * 2; i++)
  175.         {
  176.                 if (ans >= 10)
  177.                 {
  178.                         ans[i + 1] = ans[i + 1] + ans / 10;
  179.                         ans = ans % 10;
  180.                 }
  181.         }
  182.         for (i = len * 2; i>0; i--)
  183.         {
  184.                 if (ans != 0)
  185.                         break;
  186.         }
  187.         if (result[0] != '-')
  188.                 j = 0;
  189.         else
  190.                 j = 1;
  191.         while (i >= 0)
  192.         {
  193.                 result[j] = ans + '0';
  194.                 j++;
  195.                 i--;
  196.         }
  197. }
  198. int SubStract(int *p1, int *p2, int len1, int len2)
  199. {
  200.         int i;
  201.         if (len1<len2)
  202.                 return -1;
  203.         if (len1 == len2)
  204.         {
  205.                 for (i = len1 - 1; i >= 0; i--)
  206.                 {
  207.                         if (p1>p2)
  208.                                 break;
  209.                         else if (p1<p2)
  210.                                 return -1;
  211.                 }
  212.         }
  213.         for (i = 0; i <= len1 - 1; i++)
  214.         {
  215.                 p1 -= p2;
  216.                 if (p1<0)
  217.                 {
  218.                         p1 += 10;
  219.                         p1[i + 1]--;
  220.                 }
  221.         }
  222.         for (i = len1 - 1; i >= 0; i--)
  223.                 if (p1)
  224.                         return i + 1;
  225.         return 0;
  226. }
  227. void division(char str1[], char str2[], char result[])
  228. {
  229.         int i, j;
  230.         int nTimes;
  231.         int nTemp;
  232.         int num1[MAX] = { 0 };
  233.         int num2[MAX] = { 0 };
  234.         int ans[MAX] = { 0 };
  235.         int len1 = strlen(str1);
  236.         int len2 = strlen(str2);
  237.         for (j = 0, i = len1 - 1; i >= 0; j++, i--)
  238.                 num1[j] = str1 - '0';
  239.         for (j = 0, i = len2 - 1; i >= 0; j++, i--)
  240.                 num2[j] = str2 - '0';
  241.         if (len1<len2)
  242.         {
  243.                 result[0] = '0';
  244.                 return;
  245.         }
  246.         nTimes = len1 - len2;
  247.         for (i = len1 - 1; i >= 0; i--)
  248.         {
  249.                 if (i >= nTimes)
  250.                         num2 = num2[i - nTimes];
  251.                 else
  252.                         num2 = 0;
  253.         }
  254.         len2 = len1;
  255.         for (j = 0; j <= nTimes; j++)
  256.         {
  257.                 while ((nTemp = SubStract(num1, num2 + j, len1, len2 - j)) >= 0)
  258.                 {
  259.                         len1 = nTemp;
  260.                         ans[nTimes - j]++;
  261.                 }
  262.         }
  263.         for (i = 9; i >= 0; i--)
  264.         {
  265.                 if (ans != 0)
  266.                         break;
  267.         }
  268.         if (result[0] != '-')
  269.                 j = 0;
  270.         else
  271.                 j = 1;
  272.         while (i >= 0)
  273.         {
  274.                 result[j] = ans + '0';
  275.                 j++;
  276.                 i--;
  277.         }
  278. }
  279. istream & operator>>(istream &is, doublelong &ob)
  280. {
  281.         is >> ob.number;
  282.         return is;
  283. }
  284. ostream & operator<<(ostream &os, const doublelong &ob)
  285. {
  286.         os << ob.number;
  287.         return os;
  288. }
  289. doublelong operator+(doublelong &ob1, doublelong &ob2)
  290. {
  291.         char result[MAX];
  292.         char str1[MAX], str2[MAX];
  293.         strcpy(str1, ob1.number);
  294.         strcpy(str2, ob2.number);
  295.         if (str1[0] == '-'&&str2[0] == '-')
  296.         {
  297.                 result[0] = '-';
  298.                 add(str1 + 1, str2 + 1, result);
  299.         }
  300.         else if (str1[0] == '-'&&str2[0] != '-')
  301.         {
  302.                 int len1 = strlen(str1 + 1);
  303.                 int len2 = strlen(str2);
  304.                 if (len1 == len2)
  305.                 {
  306.                         if (strcmp(str1 + 1, str2)>0)
  307.                         {
  308.                                 result[0] = '-';
  309.                                 sub(str1 + 1, str2, result);
  310.                         }
  311.                         else
  312.                         {
  313.                                 sub(str2, str1 + 1, result);
  314.                         }
  315.                 }
  316.                 else if (len1>len2)
  317.                 {
  318.                         result[0] = '-';
  319.                         sub(str1 + 1, str2, result);
  320.                 }
  321.                 else
  322.                 {
  323.                         sub(str1 + 1, str2, result);
  324.                 }
  325.         }
  326.         else if (str1[0] != '-'&&str2[0] == '-')
  327.         {
  328.                 int len1 = strlen(str1);
  329.                 int len2 = strlen(str2 + 1);
  330.                 if (len1 == len2)
  331.                 {
  332.                         if (strcmp(str1, str2 + 1)>0)
  333.                         {
  334.                                 sub(str1, str2 + 1, result);
  335.                         }
  336.                         else
  337.                         {
  338.                                 result[0] = '-';
  339.                                 sub(str2 + 1, str1, result);
  340.                         }
  341.                 }
  342.                 else if (len1<len2)
  343.                 {
  344.                         result[0]='-';
  345.                         sub(str1, str2 + 1, result);
  346.                 }
  347.                 else
  348.                 {
  349.                         sub(str1, str2 + 1, result);
  350.                 }
  351.         }
  352.         else if (str1[0] != '-'&&str2[0] != '-')
  353.         {
  354.                 add(str1, str2, result);
  355.         }
  356.         return doublelong(result);
  357. }
  358. doublelong operator-(doublelong &ob1, doublelong &ob2)
  359. {
  360.         char result[MAX];
  361.         char str1[MAX], str2[MAX];
  362.         strcpy(str1, ob1.number);
  363.         strcpy(str2, ob2.number);
  364.         if (str1[0] != '-'&&str2[0] == '-')
  365.         {
  366.                 add(str1, str2 + 1, result);
  367.         }
  368.         else if (str1[0] == '-'&&str2[0] != '-')
  369.         {
  370.                 result[0] = '-';
  371.                 add(str1 + 1, str2, result);
  372.         }
  373.         else if (str1[0] != '-'&&str2[0] != '-')
  374.         {
  375.                 int len1 = strlen(str1);
  376.                 int len2 = strlen(str2);
  377.                 if (len1 == len2)
  378.                 {
  379.                         if (strcmp(str1, str2)>0)
  380.                         {
  381.                                 sub(str1, str2, result);
  382.                         }
  383.                         else
  384.                         {
  385.                                 result[0] = '-';
  386.                                 sub(str2, str1, result);
  387.                         }
  388.                 }
  389.                 else if (len1>len2)
  390.                 {
  391.                         sub(str1, str2, result);
  392.                 }
  393.                 else
  394.                 {
  395.                         result[0] = '-';
  396.                         sub(str1, str2, result);
  397.                 }
  398.         }
  399.         else
  400.         {
  401.                 int len1 = strlen(str1 + 1);
  402.                 int len2 = strlen(str2 + 1);
  403.                 if (len1 == len2)
  404.                 {
  405.                         if (strcmp(str2 + 1, str1 + 1) >= 0)
  406.                         {
  407.                                 sub(str2 + 1, str1 + 1, result);
  408.                         }
  409.                         else
  410.                         {
  411.                                 result[0] = '-';
  412.                                 sub(str1 + 1, str2 + 1, result);
  413.                         }
  414.                 }
  415.                 else if (len1>len2)
  416.                 {
  417.                         result[0] = '-';
  418.                         sub(str1 + 1, str2 + 1, result);
  419.                 }
  420.                 else
  421.                 {
  422.                         sub(str1 + 1, str2 + 1, result);
  423.                 }
  424.         }
  425.         return doublelong(result);
  426. }
  427. doublelong operator*(doublelong &ob1, doublelong &ob2)
  428. {
  429.         char result[MAX];
  430.         char str1[MAX], str2[MAX];
  431.         strcpy(str1, ob1.number);
  432.         strcpy(str2, ob2.number);
  433.         if (strcmp(str1, "0") == 0 || strcmp(str2, "0") == 0)
  434.         {
  435.                 return doublelong("0");
  436.         }
  437.         if (str1[0] != '-'&&str2[0] == '-')
  438.         {
  439.                 result[0] = '-';
  440.                 multiply(str1, str2 + 1, result);
  441.         }
  442.         else if (str1[0] == '-'&&str2[0] != '-')
  443.         {
  444.                 result[0] = '-';
  445.                 multiply(str1 + 1, str2, result);
  446.         }
  447.         else if (str1[0] == '-'&&str2[0] == '-')
  448.         {
  449.                 multiply(str1 + 1, str2 + 1, result);
  450.         }
  451.         else
  452.         {
  453.                 multiply(str1, str2, result);
  454.         }
  455.         return doublelong(result);
  456. }
  457. doublelong operator/(doublelong &ob1, doublelong &ob2)
  458. {
  459.         char result[MAX];
  460.         char str1[MAX], str2[MAX];
  461.         strcpy(str1, ob1.number);
  462.         strcpy(str2, ob2.number);
  463.         if (str1[0] != '-'&&str2[0] == '-')
  464.         {
  465.                 result[0] = '-';
  466.                 division(str1, str2 + 1, result);
  467.         }
  468.         else if (str1[0] == '-'&&str2[0] != '-')
  469.         {
  470.                 result[0] = '-';
  471.                 division(str1 + 1, str2, result);
  472.         }
  473.         else if (str1[0] == '-'&&str2[0] == '-')
  474.         {
  475.                 division(str1 + 1, str2 + 1, result);
  476.         }
  477.         else
  478.         {
  479.                 division(str1, str2, result);
  480.         }
  481.         return doublelong(result);
  482. }
  483. void doublelong::operator+=(doublelong &ob)
  484. {
  485.         char result[MAX];
  486.         char str1[MAX], str2[MAX];
  487.         strcpy(str1, this->number);
  488.         strcpy(str2, ob.number);
  489.         if (str1[0] == '-'&&str2[0] == '-')
  490.         {
  491.                 result[0] = '-';
  492.                 add(str1 + 1, str2 + 1, result);
  493.         }
  494.         else if (str1[0] == '-'&&str2[0] != '-')
  495.         {
  496.                 int len1 = strlen(str1 + 1);
  497.                 int len2 = strlen(str2);
  498.                 if (len1 == len2)
  499.                 {
  500.                         if (strcmp(str1 + 1, str2)>0)
  501.                         {
  502.                                 result[0] = '-';
  503.                                 sub(str1 + 1, str2, result);
  504.                         }
  505.                         else
  506.                         {
  507.                                 sub(str2, str1 + 1, result);
  508.                         }
  509.                 }
  510.                 else if (len1>len2)
  511.                 {
  512.                         result[0] = '-';
  513.                         sub(str1 + 1, str2, result);
  514.                 }
  515.                 else
  516.                 {
  517.                         sub(str1 + 1, str2, result);
  518.                 }
  519.         }
  520.         else if (str1[0] != '-'&&str2[0] == '-')
  521.         {
  522.                 int len1 = strlen(str1);
  523.                 int len2 = strlen(str2 + 1);
  524.                 if (len1 == len2)
  525.                 {
  526.                         if (strcmp(str1, str2 + 1)>0)
  527.                         {
  528.                                 sub(str1, str2 + 1, result);
  529.                         }
  530.                         else
  531.                         {
  532.                                 result[0] = '-';
  533.                                 sub(str2 + 1, str1, result);
  534.                         }
  535.                 }
  536.                 else if (len1<len2)
  537.                 {
  538.                         result[0]='-';
  539.                         sub(str1, str2 + 1, result);
  540.                 }
  541.                 else
  542.                 {
  543.                         sub(str1, str2 + 1, result);
  544.                 }
  545.         }
  546.         else if (str1[0] != '-'&&str2[0] != '-')
  547.         {
  548.                 add(str1, str2, result);
  549.         }
  550.         strcpy(this->number, result);
  551. }
  552. void doublelong::operator-=(doublelong &ob)
  553. {
  554.         char result[MAX];
  555.         char str1[MAX], str2[MAX];
  556.         strcpy(str1, this->number);
  557.         strcpy(str2, ob.number);
  558.         if (str1[0] != '-'&&str2[0] == '-')
  559.         {
  560.                 add(str1, str2 + 1, result);
  561.         }
  562.         else if (str1[0] == '-'&&str2[0] != '-')
  563.         {
  564.                 result[0] = '-';
  565.                 add(str1 + 1, str2, result);
  566.         }
  567.         else if (str1[0] != '-'&&str2[0] != '-')
  568.         {
  569.                 int len1 = strlen(str1);
  570.                 int len2 = strlen(str2);
  571.                 if (len1 == len2)
  572.                 {
  573.                         if (strcmp(str1, str2)>0)
  574.                         {
  575.                                 sub(str1, str2, result);
  576.                         }
  577.                         else
  578.                         {
  579.                                 result[0] = '-';
  580.                                 sub(str2, str1, result);
  581.                         }
  582.                 }
  583.                 else if (len1>len2)
  584.                 {
  585.                         sub(str1, str2, result);
  586.                 }
  587.                 else
  588.                 {
  589.                         result[0] = '-';
  590.                         sub(str1, str2, result);
  591.                 }
  592.         }
  593.         else
  594.         {
  595.                 int len1 = strlen(str1 + 1);
  596.                 int len2 = strlen(str2 + 1);
  597.                 if (len1 == len2)
  598.                 {
  599.                         if (strcmp(str2 + 1, str1 + 1) >= 0)
  600.                         {
  601.                                 sub(str2 + 1, str1 + 1, result);
  602.                         }
  603.                         else
  604.                         {
  605.                                 result[0] = '-';
  606.                                 sub(str1 + 1, str2 + 1, result);
  607.                         }
  608.                 }
  609.                 else if (len1>len2)
  610.                 {
  611.                         result[0] = '-';
  612.                         sub(str1 + 1, str2 + 1, result);
  613.                 }
  614.                 else
  615.                 {
  616.                         sub(str1 + 1, str2 + 1, result);
  617.                 }
  618.         }
  619.         strcpy(this->number, result);
  620. }
  621. void doublelong::operator/=(doublelong &ob)
  622. {
  623.         char result[MAX];
  624.         char str1[MAX], str2[MAX];
  625.         strcpy(str1, this->number);
  626.         strcpy(str2, ob.number);
  627.         if (str1[0] != '-'&&str2[0] == '-')
  628.         {
  629.                 result[0] = '-';
  630.                 division(str1, str2 + 1, result);
  631.         }
  632.         else if (str1[0] == '-'&&str2[0] != '-')
  633.         {
  634.                 result[0] = '-';
  635.                 division(str1 + 1, str2, result);
  636.         }
  637.         else if (str1[0] == '-'&&str2[0] == '-')
  638.         {
  639.                 division(str1 + 1, str2 + 1, result);
  640.         }
  641.         else
  642.         {
  643.                 division(str1, str2, result);
  644.         }
  645.         strcpy(this->number, result);
  646. }
  647. int main()
  648. {
  649.         doublelong a = "100", b = "-7", c;
  650.         c = a*b;
  651.         cout << c << endl;
  652.         c = "0";
  653.         cout << c << endl;
  654.         return 0;
  655. }
复制代码

这个应该是把字符串变成数字运算
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-3 13:52:30 | 显示全部楼层
TCY 发表于 2019-1-3 13:25
用代码格式:

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

我想知道四则运算的算法具体每一步是啥意思,能否注释一下?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-3 18:29:10 | 显示全部楼层
写代码的应该该批,这么长的代码一点注释都没有,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表