鱼C论坛

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

[技术交流] 字符串计算加减法完成

[复制链接]
发表于 2019-12-30 00:49:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bin554385863 于 2019-12-30 16:13 编辑

2019年12月30日15:00:34

添加新数据
bool  iszero; 判断一个数字字符串是否为0;

struct attr
    {
        int sign = 1; //符号
        bool iszero = true;//默认为true
        size_t dpsize = 0;     //小数位;
        size_t prec = 0;       //精度
        size_t nsize = 1;      //有效位数
        string str = "0";      //过渡字符串
        vector<int> vec = {0}; //数组;
    };

对应新函数

const bool IsZero(const lnum &l) const;

const bool lnum::IsZero(const lnum &l) const
{
    return !((!num.iszero) || (!l.num.iszero));
}

lnum.h
  1. #ifndef LNUM_H
  2. #define LNUM_H
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. using std::istream;
  7. using std::ostream;
  8. using std::string;
  9. using std::vector;
  10. class lnum
  11. {
  12.     struct attr
  13.     {
  14.         int sign = 1; //符号
  15.         bool iszero = true;
  16.         size_t dpsize = 0;     //小数位;
  17.         size_t prec = 0;       //精度
  18.         size_t nsize = 1;      //有效位数
  19.         string str = "0";      //过渡字符串
  20.         vector<int> vec = {0}; //数组;
  21.     };
  22.     struct align
  23.     {
  24.         vector<int> first;
  25.         vector<int> second;
  26.     };

  27. private:
  28.     //小数精度;
  29.     static size_t precision;
  30.     //数据;
  31.     attr num;
  32.     //str to attr
  33.     const attr StrToAttr(const string &str) const;
  34.     //attr to str
  35.     const string AttrToStr() const;
  36.     //进1
  37.     lnum &Carry();
  38.     //借1
  39.     lnum Borrow();
  40.     //对齐
  41.     const align AlignVec(const vector<int> &m, const vector<int> &n) const;
  42.     //clear zero vec
  43.     lnum &ClearZeroVec();
  44.     //vec to str
  45.     lnum &VecToStr();
  46.     //iszero
  47.     const bool IsZero(const lnum &l) const;

  48. public:
  49.     lnum(const char *cstr = "0") : num(StrToAttr(cstr)) {}
  50.     lnum(const string &str) : num(StrToAttr(str)) {}
  51.     lnum(const lnum &l) : num(l.num) {}
  52.     //------------------------------------------------------------------
  53.     //设置精度
  54.     static void SetPrecision(const size_t i);
  55.     //展示信息
  56.     void Showinfo() const;
  57.     //>
  58.     const bool operator>(const lnum &l) const;
  59.     //<
  60.     const bool operator<(const lnum &l) const;
  61.     //==
  62.     const bool operator==(const lnum &l) const;
  63.     //>=
  64.     const bool operator>=(const lnum &l) const;
  65.     //<=
  66.     const bool operator<=(const lnum &l) const;
  67.     //+
  68.     const lnum operator+(const lnum &l) const;
  69.     //-
  70.     const lnum operator-(const lnum &l) const;
  71.     const lnum operator-() const;
  72.     //+=
  73.     const lnum &operator+=(const lnum &l);
  74.     //++
  75.     const lnum &operator++();
  76.     //-=
  77.     const lnum &operator-=(const lnum &l);
  78.     //--
  79.     const lnum &operator--();
  80.     //odject++
  81.     friend const lnum &operator++(lnum &l, const int i);
  82.     //object--
  83.     friend const lnum &operator--(lnum &l, const int i);
  84.     //>>
  85.     friend istream &operator>>(istream &is, const lnum &l);
  86.     //<<
  87.     friend ostream &operator<<(ostream &os, const lnum &l);
  88. };
  89. size_t lnum::precision = 0;
  90. #endif
复制代码

lnum.cpp
  1. #include "E:\Users\admin\Documents\VScode\Code\My Class\shape.cpp\lnum\lnum.h"
  2. //str to attr
  3. const lnum::attr lnum::StrToAttr(const string &str) const
  4. {
  5.     attr n;
  6.     n.prec = precision;
  7.     n.str = str;
  8.     string &nstr = n.str;
  9.     size_t &ndps = n.dpsize, &npre = n.prec;
  10.     if (nstr[0] == '-')
  11.     {
  12.         nstr.erase(0, 1);
  13.     }
  14.     if (int(nstr.find('.')) != -1)
  15.     {
  16.         nstr.erase(nstr.find('.'), 1);
  17.     }
  18.     if (nstr == string(nstr.size(), '0'))
  19.     {
  20.         nstr.clear();
  21.         nstr.push_back('0');
  22.     }
  23.     else //if (nstr != string(nstr.size(), '0'))
  24.     {
  25.         
  26.         n.iszero = false;//iszero
  27.         size_t s = nstr.size(), i = 0;
  28.         if (str[0] == '-')
  29.         {
  30.             n.sign = -1;
  31.         }
  32.         if (int(str.find('.')) != -1)
  33.         {
  34.             ndps = str.size() - str.find('.') - 1;
  35.             if (nstr[0] == '0')
  36.             {

  37.                 for (; i < s; i++)
  38.                 {
  39.                     if (nstr[i] != '0')
  40.                     {
  41.                         break;
  42.                     }
  43.                 }
  44.                 if (i >= s - ndps)
  45.                 {
  46.                     nstr.erase(0, s - ndps - 1);
  47.                 }
  48.                 else if (i < s - ndps)
  49.                 {
  50.                     nstr.erase(0, i);
  51.                 }
  52.             }
  53.         }
  54.         else
  55.         {
  56.             if (nstr[0] == '0')
  57.             {
  58.                 for (i = 0; i < s; i++)
  59.                 {
  60.                     if (nstr[i] != '0')
  61.                     {
  62.                         break;
  63.                     }
  64.                 }
  65.                 nstr.erase(0, i);
  66.             }
  67.         }
  68.         if (npre > ndps)
  69.         {
  70.             nstr.insert(nstr.end(), npre - ndps, '0');
  71.         }
  72.         else if (npre < ndps)
  73.         {
  74.             nstr.erase(nstr.size() - (ndps - npre));
  75.             ndps = npre;
  76.         }
  77.         n.vec.clear();
  78.         for (char c : nstr)
  79.         {
  80.             n.vec.push_back(c - 48);
  81.         }
  82.         n.nsize = nstr.size();
  83.     }
  84.     return n;
  85. }
  86. //attr to str
  87. const string lnum::AttrToStr() const
  88. {
  89.     string t = num.str, &str = t;
  90.     const size_t &prec = num.prec, &dpsize = num.dpsize;
  91.     if (prec != 0 && str.size() != 1)
  92.     {
  93.         if (dpsize == prec)
  94.         {
  95.             str.insert(str.size() - prec, 1, '.');
  96.         }
  97.         else if (dpsize < prec && dpsize != 0)
  98.         {
  99.             str.erase(str.size() - (prec - dpsize));
  100.             str.insert(str.size() - dpsize, 1, '.');
  101.         }
  102.         else if (dpsize == 0)
  103.         {
  104.             str.erase(str.size() - prec);
  105.         }
  106.     }
  107.     if (num.sign == -1)
  108.     {
  109.         str.insert(0, 1, '-');
  110.     }
  111.     return str;
  112. }
  113. //进1
  114. lnum &lnum::Carry()
  115. {
  116.     vector<int> &v = num.vec;
  117.     v.insert(v.begin(), 1, 0);
  118.     size_t s = v.size();
  119.     for (size_t i = s - 1; i > 0; i--)
  120.     {
  121.         int t = v[i];
  122.         v[i] = t % 10;
  123.         v[i - 1] += t / 10;
  124.     }
  125.     return *this;
  126. }
  127. //借1
  128. lnum lnum::Borrow()
  129. {
  130.     vector<int> &v = num.vec;
  131.     size_t s = v.size();
  132.     for (size_t i = 1; i < s; i++)
  133.     {
  134.         v[i - 1] -= 1;
  135.         v[i] += 10;
  136.     }
  137.     return *this;
  138. }
  139. //对齐
  140. const lnum::align lnum::AlignVec(const vector<int> &m, const vector<int> &n) const
  141. {
  142.     align agn;
  143.     vector<int> &fst = agn.first, &sec = agn.second;
  144.     fst = m, sec = n;
  145.     size_t fsize = fst.size(), ssize = sec.size();
  146.     if (fsize < ssize)
  147.     {
  148.         fst.insert(fst.begin(), ssize - fsize, 0);
  149.     }
  150.     else if (fsize > ssize)
  151.     {
  152.         sec.insert(sec.begin(), fsize - ssize, 0);
  153.     }
  154.     return agn;
  155. }
  156. //clear zero vec
  157. lnum &lnum::ClearZeroVec()
  158. {
  159.     const size_t &prec = num.prec;
  160.     vector<int> &v = num.vec;
  161.    
  162.     if (num.iszero)//v == vector<int>(v.size(), 0)
  163.     {
  164.         v.clear();
  165.         v.push_back(0);
  166.     }
  167.     else if (v[0] == 0)
  168.     {
  169.         size_t s = v.size(), i = 0;
  170.         if (prec != 0)
  171.         {

  172.             for (; i < s; i++)
  173.             {
  174.                 if (v[i] != 0)
  175.                 {
  176.                     break;
  177.                 }
  178.             }
  179.             if (i >= s - prec)
  180.             {
  181.                 v.erase(v.begin(), v.begin() + (s - prec - 1));
  182.             }
  183.             else if (i < s - prec)
  184.             {
  185.                 v.erase(v.begin(), v.begin() + i);
  186.             }
  187.         }
  188.         else
  189.         {
  190.             for (i = 0; i < s; i++)
  191.             {
  192.                 if (v[i] != 0)
  193.                 {
  194.                     break;
  195.                 }
  196.             }
  197.             v.erase(v.begin(), v.begin() + i);
  198.         }
  199.     }
  200.     return *this;
  201. }
  202. //vec to str
  203. lnum &lnum::VecToStr()
  204. {
  205.     num.str.clear();
  206.     for (int i : num.vec)
  207.     {
  208.         num.str.push_back(i + 48);
  209.     }
  210.     return *this;
  211. }
  212. //iszero
  213. const bool lnum::IsZero(const lnum &l) const
  214. {
  215.     return !((!num.iszero) || (!l.num.iszero));
  216. }
  217. //------------------------------------------------------------------------
  218. //设置精度
  219. void lnum::SetPrecision(const size_t i)
  220. {
  221.     lnum::precision = i;
  222. }
  223. //展示信息
  224. void lnum::Showinfo() const
  225. {
  226.     std::cout << "有效数位: ";
  227.     for (int i : num.vec)
  228.     {
  229.         std::cout << i << " ";
  230.     }
  231.     std::cout << std::endl;
  232.     std::cout << "正负符号: " << num.sign << "\n"
  233.               << std::boolalpha << "是否为零: " << num.iszero << "\n"
  234.               << "小数位数: " << num.dpsize << "\n"
  235.               << "小数精度: " << num.prec << "\n"
  236.               << "有效位数: " << num.nsize << std::endl;
  237. }
  238. //>
  239. const bool lnum::operator>(const lnum &l) const
  240. {
  241.     bool f = true;
  242.     align agn = AlignVec(num.vec, l.num.vec);
  243.     const vector<int> &fst = agn.first, &sec = agn.second;
  244.     if (num.sign < l.num.sign)
  245.     {
  246.         f = false;
  247.     }
  248.     if (num.sign == l.num.sign)
  249.     {
  250.         f = fst > sec;
  251.         if (num.sign == -1)
  252.         {
  253.             f = !f;
  254.         }
  255.     }
  256.     return f;
  257. }
  258. //<
  259. const bool lnum::operator<(const lnum &l) const
  260. {
  261.     bool f = true;
  262.     align agn = AlignVec(num.vec, l.num.vec);
  263.     const vector<int> &fst = agn.first, &sec = agn.second;
  264.     if (num.sign > l.num.sign)
  265.     {
  266.         f = false;
  267.     }
  268.     if (num.sign == l.num.sign)
  269.     {
  270.         f = fst < sec;
  271.         if (num.sign == -1)
  272.         {
  273.             f = !f;
  274.         }
  275.     }
  276.     return f;
  277. }
  278. //==
  279. const bool lnum::operator==(const lnum &l) const
  280. {
  281.     align agn = AlignVec(num.vec, l.num.vec);
  282.     const vector<int> &fst = agn.first, &sec = agn.second;
  283.     return fst == sec && num.sign == l.num.sign;
  284. }
  285. //>=
  286. const bool lnum::operator>=(const lnum &l) const
  287. {
  288.     return !(*this < l);
  289. }
  290. //<=
  291. const bool lnum::operator<=(const lnum &l) const
  292. {
  293.     return !(*this > l);
  294. }
  295. //+
  296. const lnum lnum::operator+(const lnum &l) const
  297. {

  298.     lnum r;
  299.     attr &lr = r.num;
  300.     lr.iszero = this->IsZero(l);
  301.     const align &agn = AlignVec(num.vec, l.num.vec);
  302.     const int &tsgn = num.sign, &lsgn = l.num.sign;
  303.     const vector<int> &fst = agn.first, &sec = agn.second, &tvec = num.vec, &lvec = l.num.vec;
  304.     lr.prec = num.prec;
  305.     lr.dpsize = (num.dpsize >= l.num.dpsize ? num.dpsize : l.num.dpsize);
  306.     size_t s = (fst.size() <= sec.size() ? fst.size() : sec.size());
  307.     lr.vec = (fst >= sec ? fst : sec);
  308.     for (size_t i = 0; i < s; i++)
  309.     {
  310.         lr.vec[i] += (tsgn * lsgn) * ((sec <= fst ? sec : fst)[i]);
  311.     }
  312.     if ((fst > sec && tsgn < lsgn) || (fst < sec && tsgn > lsgn) || (tsgn == -1 && lsgn == -1))
  313.     {
  314.         lr.sign = -1;
  315.     }
  316.     if (tsgn * lsgn == -1)
  317.     {
  318.         r.Borrow();
  319.     }
  320.     r.Carry().ClearZeroVec().VecToStr();
  321.     lr.nsize = lr.vec.size();
  322.     return r;
  323. }
  324. //符号取反
  325. const lnum lnum::operator-() const
  326. {
  327.     const vector<int> &tvec = num.vec;
  328.     lnum r = *this;
  329.     if (num.iszero == false)//(tvec != vector<int>(tvec.size(), 0))
  330.     {
  331.         r.num.sign = -num.sign;
  332.     }
  333.     return r;
  334. }
  335. //-
  336. const lnum lnum::operator-(const lnum &l) const
  337. {
  338.     lnum r;
  339.     r.num.iszero = this->IsZero(l);
  340.     if (l.num.iszero == false)//(l.num.vec != vector<int>(1, 0))
  341.     {
  342.         r = *this + (-l);
  343.     }
  344.     else
  345.     {
  346.         r = *this;
  347.     }
  348.     return r;
  349. }
  350. //+=
  351. const lnum &lnum::operator+=(const lnum &l)
  352. {
  353.     *this = *this + l;
  354.     return *this;
  355. }
  356. //前置++
  357. const lnum &lnum::operator++()
  358. {
  359.     return *this += "1";
  360. }
  361. //-=
  362. const lnum &lnum::operator-=(const lnum &l)
  363. {
  364.     *this = *this - l;
  365.     return *this;
  366. }
  367. //前置--
  368. const lnum &lnum::operator--()
  369. {
  370.     return *this -= "1";
  371. }
  372. //后置++
  373. const lnum &operator++(lnum &l, const int i)
  374. {
  375.     return ++l;
  376. }
  377. //后置--
  378. const lnum &operator--(lnum &l, const int i)
  379. {
  380.     return --l;
  381. }
  382. //>>
  383. istream &operator>>(istream &is, lnum &l)
  384. {
  385.     string str;
  386.     (is >> str).get();
  387.     l = str;
  388.     return is;
  389. }
  390. //<<
  391. ostream &operator<<(ostream &os, const lnum &l)
  392. {
  393.     os << l.AttrToStr();
  394.     return os;
  395. }
复制代码

test.cpp
  1. #include "E:\Users\admin\Documents\VScode\Code\My Class\shape.cpp\lnum\lnum.cpp"
  2. #include <ctime>
  3. #include <cmath>
  4. int main(int argc, char const *argv[])
  5. {
  6.     int s = 0;
  7.     lnum::SetPrecision(6);
  8.     lnum a, b;
  9.     char n[9], m[9];
  10.     n[8] = m[8] = '\0';
  11.     srand(time(NULL));
  12.     while (s != 12)
  13.     {
  14.         for (size_t i = 0; i < 8; i++)
  15.         {
  16.             n[i] = rand() % 9 + 48;

  17.             m[i] = rand() % 9 + 48;
  18.         }
  19.         n[rand() % 6 + 1] = '.';
  20.         m[rand() % 6 + 1] = '.';
  21.         if (s % 2 == 0)
  22.         {
  23.             n[0] = '-';
  24.         }
  25.         if (s % 3 == 0)
  26.         {
  27.             m[0] = '-';
  28.         }
  29.         a = m;
  30.         b = n;
  31.         std::cout << "第" << s << "组" << std::endl;
  32.         std::cout << a << " - " << b << " = " << (a - b) << "\n"
  33.                   << a << " + " << b << " = " << (a + b) << "\n\n"
  34.                   << std::boolalpha
  35.                   << a << " >  " << b << ": " << (a > b) << "\n\n"
  36.                   << a << " == " << b << ": " << (a == b) << "\n\n"
  37.                   << a << " <  " << b << ": " << (a < b) << "\n\n"
  38.                   << a << " >= " << b << ": " << (a >= b) << "\n\n"
  39.                   << a << " <= " << b << ": " << (a <= b) << "\n"
  40.                   << "------------------------------------------------"
  41.                   << "\n\n";
  42.         s++;
  43.     }
  44.     return 0;
  45. }
复制代码

---------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.535]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-r4eqqtl4.g4x --stdout=Microsoft-MIEngine-Out-tdxveute.slr --stderr=Microsoft-MIEngine-Error-mmf3t4g3.0vo --pid=Microsoft-MIEngine-Pid-ube4pyyu.txb --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
第0组
-65066.5 - -28541.3 = -36525.2
-65066.5 + -28541.3 = -93607.8

-65066.5 >  -28541.3: false   

-65066.5 == -28541.3: false   

-65066.5 <  -28541.3: true   

-65066.5 >= -28541.3: false

-65066.5 <= -28541.3: true
------------------------------------------------

第1组
45.31752 - 86.42017 = -41.10265
45.31752 + 86.42017 = 131.73769

45.31752 >  86.42017: false

45.31752 == 86.42017: false

45.31752 <  86.42017: true

45.31752 >= 86.42017: false

45.31752 <= 86.42017: true
------------------------------------------------

第2组
5.601777 - -65.7413 = 71.343077
5.601777 + -65.7413 = -60.139523

5.601777 >  -65.7413: true

5.601777 == -65.7413: false

5.601777 <  -65.7413: false

5.601777 >= -65.7413: true

5.601777 <= -65.7413: false
------------------------------------------------

第3组
-6618.72 - 581607.6 = -588226.32
-6618.72 + 581607.6 = 574988.88

-6618.72 >  581607.6: false

-6618.72 == 581607.6: false

-6618.72 <  581607.6: true

-6618.72 >= 581607.6: false

-6618.72 <= 581607.6: true
------------------------------------------------

第4组
36812.51 - -27147.1 = 63959.61
36812.51 + -27147.1 = 9665.41

36812.51 >  -27147.1: true

36812.51 == -27147.1: false

36812.51 <  -27147.1: false

36812.51 >= -27147.1: true

36812.51 <= -27147.1: false
------------------------------------------------

第5组
445684.7 - 4821.640 = 440863.060
445684.7 + 4821.640 = 450506.340

445684.7 >  4821.640: true

445684.7 == 4821.640: false

445684.7 <  4821.640: false

445684.7 >= 4821.640: true

445684.7 <= 4821.640: false
------------------------------------------------

第6组
-.650710 - -4.45786 = 3.807150
-.650710 + -4.45786 = -5.108570

-.650710 >  -4.45786: true

-.650710 == -4.45786: false

-.650710 <  -4.45786: false

-.650710 >= -4.45786: true

-.650710 <= -4.45786: false
------------------------------------------------

第7组
154.2605 - 350.4061 = -196.1456
154.2605 + 350.4061 = 504.6666

154.2605 >  350.4061: false

154.2605 == 350.4061: false

154.2605 <  350.4061: true

154.2605 >= 350.4061: false

154.2605 <= 350.4061: true
------------------------------------------------

第8组
47.87481 - -5507.32 = 5555.19481
47.87481 + -5507.32 = -5459.44519

47.87481 >  -5507.32: true

47.87481 == -5507.32: false

47.87481 <  -5507.32: false

47.87481 >= -5507.32: true

47.87481 <= -5507.32: false
------------------------------------------------

第9组
-653.76 - 680005.7 = -680659.46
-653.76 + 680005.7 = 679351.94

-653.76 >  680005.7: false

-653.76 == 680005.7: false

-653.76 <  680005.7: true

-653.76 >= 680005.7: false

-653.76 <= 680005.7: true
------------------------------------------------

第10组
462520.0 - -28804.2 = 491324.2
462520.0 + -28804.2 = 433715.8

462520.0 >  -28804.2: true

462520.0 == -28804.2: false

462520.0 <  -28804.2: false

462520.0 >= -28804.2: true

462520.0 <= -28804.2: false
------------------------------------------------

第11组
746407.4 - 150352.6 = 596054.8
746407.4 + 150352.6 = 896760.0

746407.4 >  150352.6: true

746407.4 == 150352.6: false

746407.4 <  150352.6: false

746407.4 >= 150352.6: true

746407.4 <= 150352.6: false
------------------------------------------------


E:\Users\admin\Documents\VScode\Code>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-30 16:31:05 | 显示全部楼层
小数测试
  1. #include "E:\Users\admin\Documents\VScode\Code\My Class\shape.cpp\lnum\lnum.cpp"
  2. #include <ctime>
  3. #include <cmath>
  4. int main(int argc, char const *argv[])
  5. {
  6.     int s = 0;
  7.     lnum::SetPrecision(6);
  8.     lnum a, b;
  9.     char n[9], m[9];
  10.     n[8] = m[8] = '\0';
  11.     n[0] = m[0] = '0';
  12.     n[1] = m[1] = '.';
  13.     srand(time(NULL));
  14.     while (s != 12)
  15.     {
  16.         for (size_t i = 2; i < 8; i++)
  17.         {
  18.             n[i] = rand() % 9 + 48;

  19.             m[i] = rand() % 9 + 48;
  20.         }
  21.         a = m;
  22.         b = n;
  23.         std::cout << "第" << s << "组" << std::endl;
  24.         std::cout << a << " - " << b << " = " << (a - b) << "\n"
  25.                   << a << " + " << b << " = " << (a + b) << "\n\n"
  26.                   << std::boolalpha
  27.                   << a << " >  " << b << ": " << (a > b) << "\n\n"
  28.                   << a << " == " << b << ": " << (a == b) << "\n\n"
  29.                   << a << " <  " << b << ": " << (a < b) << "\n\n"
  30.                   << a << " >= " << b << ": " << (a >= b) << "\n\n"
  31.                   << a << " <= " << b << ": " << (a <= b) << "\n"
  32.                   << "------------------------------------------------"
  33.                   << "\n\n";
  34.         s++;
  35.     }
  36.     return 0;
  37. }
复制代码



Microsoft Windows [版本 10.0.18363.535]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-j1f0mdbt.xpu --stdout=Microsoft-MIEngine-Out-021215l5.0xv --stderr=Microsoft-MIEngine-Error-2rl3uu0h.4kr --pid=Microsoft-MIEngine-Pid-uv1icxtr.bqq --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
第0组
0.223161 - 0.866618 = -0.643457
0.223161 + 0.866618 = 1.089779

0.223161 >  0.866618: false   

0.223161 == 0.866618: false   

0.223161 <  0.866618: true     

0.223161 >= 0.866618: false

0.223161 <= 0.866618: true
------------------------------------------------

第1组
0.762473 - 0.464367 = 0.298106
0.762473 + 0.464367 = 1.226840

0.762473 >  0.464367: true

0.762473 == 0.464367: false

0.762473 <  0.464367: false

0.762473 >= 0.464367: true

0.762473 <= 0.464367: false
------------------------------------------------

第2组
0.476262 - 0.585035 = -0.108773
0.476262 + 0.585035 = 1.061297

0.476262 >  0.585035: false

0.476262 == 0.585035: false

0.476262 <  0.585035: true

0.476262 >= 0.585035: false

0.476262 <= 0.585035: true
------------------------------------------------

第3组
0.410685 - 0.014701 = 0.395984
0.410685 + 0.014701 = 0.425386

0.410685 >  0.014701: true

0.410685 == 0.014701: false

0.410685 <  0.014701: false

0.410685 >= 0.014701: true

0.410685 <= 0.014701: false
------------------------------------------------

第4组
0.648333 - 0.623872 = 0.024461
0.648333 + 0.623872 = 1.272205

0.648333 >  0.623872: true

0.648333 == 0.623872: false

0.648333 <  0.623872: false

0.648333 >= 0.623872: true

0.648333 <= 0.623872: false
------------------------------------------------

第5组
0.032510 - 0.044410 = -0.011900
0.032510 + 0.044410 = 0.076920

0.032510 >  0.044410: false

0.032510 == 0.044410: false

0.032510 <  0.044410: true

0.032510 >= 0.044410: false

0.032510 <= 0.044410: true
------------------------------------------------

第6组
0.272644 - 0.834857 = -0.562213
0.272644 + 0.834857 = 1.107501

0.272644 >  0.834857: false

0.272644 == 0.834857: false

0.272644 <  0.834857: true

0.272644 >= 0.834857: false

0.272644 <= 0.834857: true
------------------------------------------------

第7组
0.040500 - 0.214134 = -0.173634
0.040500 + 0.214134 = 0.254634

0.040500 >  0.214134: false

0.040500 == 0.214134: false

0.040500 <  0.214134: true

0.040500 >= 0.214134: false

0.040500 <= 0.214134: true
------------------------------------------------

第8组
0.580270 - 0.658601 = -0.078331
0.580270 + 0.658601 = 1.238871

0.580270 >  0.658601: false

0.580270 == 0.658601: false

0.580270 <  0.658601: true

0.580270 >= 0.658601: false

0.580270 <= 0.658601: true
------------------------------------------------

第9组
0.245568 - 0.438174 = -0.192606
0.245568 + 0.438174 = 0.683742

0.245568 >  0.438174: false

0.245568 == 0.438174: false

0.245568 <  0.438174: true

0.245568 >= 0.438174: false

0.245568 <= 0.438174: true
------------------------------------------------

第10组
0.432837 - 0.027714 = 0.405123
0.432837 + 0.027714 = 0.460551

0.432837 >  0.027714: true

0.432837 == 0.027714: false

0.432837 <  0.027714: false

0.432837 >= 0.027714: true

0.432837 <= 0.027714: false
------------------------------------------------

第11组
0.355876 - 0.612031 = -0.256155
0.355876 + 0.612031 = 0.967907

0.355876 >  0.612031: false

0.355876 == 0.612031: false

0.355876 <  0.612031: true

0.355876 >= 0.612031: false

0.355876 <= 0.612031: true
------------------------------------------------



E:\Users\admin\Documents\VScode\Code>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 01:44:34 | 显示全部楼层
本帖最后由 bin554385863 于 2019-12-31 02:35 编辑

实现乘法

  1. private:
  2. const lnum operator*(const int i) const;

  3. pubic:
  4. const lnum operator*(const lnum &l) const;
复制代码

  1. const lnum lnum::operator*(const lnum &l) const
  2. {
  3.     lnum r, t;
  4.     attr &rum = r.num, &tum = t.num;
  5.     rum.prec = num.prec;
  6.     const attr &lum = l.num;
  7.     if (num.iszero == false && l.num.iszero == false)
  8.     {
  9.         
  10.         rum.iszero = false;
  11.         if (rum.prec == 0 && (*this < "1" || l < "1"))
  12.         {
  13.             rum.iszero = true;
  14.         }
  15.         const vector<int> &shrtvec = (num.nsize <= lum.nsize ? num.vec : lum.vec);
  16.         vector<int> &longvec = tum.vec;
  17.         longvec = (lum.nsize >= num.nsize ? lum.vec : num.vec);
  18.         tum.iszero = false;
  19.         size_t s = num.nsize <= lum.nsize ? num.nsize : lum.nsize;
  20.         for (size_t i = 0; i < s; i++)
  21.         {
  22.             r += t * (*(shrtvec.rbegin() + i));
  23.             if (s > 0)
  24.             {
  25.                 longvec.push_back(0);
  26.             }
  27.         }
  28.         rum.vec.erase(rum.vec.begin() + (rum.vec.size() - rum.prec), rum.vec.end());
  29.         rum.dpsize = rum.prec;
  30.         rum.nsize = rum.vec.size();
  31.         rum.vec.insert(rum.vec.begin(), rum.prec, 0);
  32.         r.ClearZeroVec().VecToStr();
  33.         rum.sign = num.sign * lum.sign;
  34.     }
  35.    
  36.     return r;
  37. }
复制代码

====================================================================
Microsoft Windows [版本 10.0.18363.535]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-3qulzdl4.dor --stdout=Microsoft-MIEngine-Out-zwwpsvl5.z2y --stderr=Microsoft-MIEngine-Error-cvvt3cjk.hx1 --pid=Microsoft-MIEngine-Pid-35akqwhf.ern --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
第0组
-0.623 * -0.897 =-0.558
------------------------------------------------
第1组
4285.3 * 93.373 = 400131.316
------------------------------------------------
第2组
-3.747 * 50.492 = -189.193
------------------------------------------------
第3组
5446.2 * -4.8 = -26141.760
------------------------------------------------
第4组
-799.5 * 43.023 = -34396.888
------------------------------------------------
第5组
1589.1 * 746.51 = 1186279.041
------------------------------------------------
第6组
-793.6 * -12.70 = 10078.720
------------------------------------------------
第7组
4112.3 * 42.183 = 173469.150
------------------------------------------------
第8组
-3.108 * 138.97 = -431.918
------------------------------------------------
第9组
171.64 * -7.917 = -1358.873
------------------------------------------------


E:\Users\admin\Documents\VScode\Code>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 02:40:50 | 显示全部楼层
test.cpp
  1. #include "E:\Users\admin\Documents\VScode\Code\My Class\shape.cpp\lnum\lnum.cpp"
  2. #include <ctime>
  3. #include <cmath>
  4. int main(int argc, char const *argv[])
  5. {
  6.     lnum::SetPrecision(3);
  7.     int s = 0;
  8.     lnum a , b;
  9.     for (lnum i = "0"; i < "1"; i+="0.09")
  10.     {
  11.         std::cout << i << " * " << (i + "3") << " = " << (i * (i + "3")) << "\n\n";
  12.     }
  13.     return 0;
  14. }
复制代码

===================================
Microsoft Windows [版本 10.0.18363.535]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-uby0stmv.mo1 --stdout=Microsoft-MIEngine-Out-04e2zrob.qhp --stderr=Microsoft-MIEngine-Error-tusfj4in.qkh --pid=Microsoft-MIEngine-Pid-ysfosizw.k5t --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
0 * 3 = 0

0.09 * 3.09 = 0.278

0.18 * 3.18 = 0.572

0.27 * 3.27 = 0.882

0.36 * 3.36 = 1.209

0.45 * 3.45 = 1.552

0.54 * 3.54 = 1.911

0.63 * 3.63 = 2.286

0.72 * 3.72 = 2.678

0.81 * 3.81 = 3.086

0.90 * 3.90 = 3.510

0.99 * 3.99 = 3.950



E:\Users\admin\Documents\VScode\Code>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 15:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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