鱼C论坛

 找回密码
 立即注册
查看: 2910|回复: 4

x的y次幂,大数运算,不要求使用数组!!

[复制链接]
发表于 2018-5-27 12:52:28 | 显示全部楼层 |阅读模式

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

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

x
RT,求助啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-27 14:15:18 | 显示全部楼层
本帖最后由 皮林重甲 于 2018-5-27 14:16 编辑

#幂函数x
def ipow(x, y):
    if y == 0:
        return 1
    return x*ipow(x, y - 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-27 18:14:49 | 显示全部楼层
  1. #include "stdio.h"
  2. #include "math.h"
  3. int main()
  4. {
  5.         int sum;
  6.         double x,y;
  7.         scanf("%lf%lf",&x,&y);
  8.         sum=pow(x,y);
  9.         printf("%d",sum);
  10. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 14:05:26 | 显示全部楼层
这个问题我比较感兴趣,就帮你写了
如果我说 你为什么不自己写,你一定会说你不会,为什么不愿意尝试一下呢?
我在写这个程序之前,我也不会,我愿意尝试,写这个程序遇到了各种各样的问题,都一一解决了,这个程序也就写完了
非常建议你自己也动手写一写,把遇到的无法解决的问题提出来,会有人给你解答

我明白,这个程序你就只是来要答案的,而这个程序我比较感兴趣
其他的就不一定了,也许其他的问题会有其他人感兴趣,会帮你写



下面的程序完全按书上的方法写,效率非常不高,就只适合学习原理
Number.hpp
  1. #ifndef _NUMBER_HPP_
  2. #define _NUMBER_HPP_

  3. #include <string>

  4. class Number
  5. {
  6. public:
  7.         Number();
  8.         Number(const Number &s);
  9.         Number(const std::string &s);
  10.         Number(const char *s);
  11.         ~Number();

  12.         operator bool();

  13.         bool operator==(const Number &s);
  14.         bool operator==(const std::string &s);
  15.         bool operator==(const char *s);
  16.         bool operator!=(const Number &s);
  17.         bool operator!=(const std::string &s);
  18.         bool operator!=(const char *s);
  19.         bool operator<(const Number &s);
  20.         bool operator<(const std::string &s);
  21.         bool operator<(const char *s);
  22.         bool operator>(const Number &s);
  23.         bool operator>(const std::string &s);
  24.         bool operator>(const char *s);
  25.         Number operator++();                        // 前缀++
  26.         Number operator++(int);                        // 后缀++
  27.         Number operator--();                        // 前缀--
  28.         Number operator--(int);                        // 后缀--
  29.         Number &operator=(const Number &s);
  30.         Number &operator=(const std::string &s);
  31.         Number &operator=(const char *s);
  32.         Number operator+(const Number &s);
  33.         Number operator+(const std::string &s);
  34.         Number operator+(const char *s);
  35.         Number operator-(const Number &s);
  36.         Number operator-(const std::string &s);
  37.         Number operator-(const char *s);
  38.         Number operator*(const Number &s);
  39.         Number operator*(const std::string &s);
  40.         Number operator*(const char *s);
  41.         Number operator/(const Number &s);
  42.         Number operator/(const std::string &s);
  43.         Number operator/(const char *s);
  44.         Number operator%(const Number &s);
  45.         Number operator%(const std::string &s);
  46.         Number operator%(const char *s);
  47.         Number operator^(const Number &s);                // 幂运算
  48.         Number operator^(const std::string &s);                // 幂运算
  49.         Number operator^(const char *s);                // 幂运算
  50.         friend std::ostream &operator<<(std::ostream &out, const Number &n);
  51.         //std::string &DebugGetNum(void);
  52. private:
  53.         std::string num;

  54.         bool IsPositiveNumber(const std::string &s);
  55.         std::string SymbolEqualAdd(const std::string &s1, const std::string &s2);        // 符号相同的加法
  56.         std::string SymbolNotEqualAdd(const std::string &s1, const std::string &s2);        // 符号不同的加法
  57.         std::string StringAdd(const std::string &s1, const std::string &s2);
  58.         std::string StringSub(const std::string &s1, const std::string &s2);
  59.         //std::string::const_reverse_iterator GetMaxR_Iterator(const std::string &s1, const std::string &s2);        // 获取最大的字符串的逆序迭代器(失败的设计)
  60.        
  61.         // 获取最大的字符串的逆序迭代器(失败的设计),这已经不是迭代器了,忘了改名字了(^_^),不过无所谓了
  62.         //const std::string *GetMaxR_Iterator(const std::string &s1, const std::string &s2);
  63.         const std::string *GetAbsoluteMaxString(const std::string &s1, const std::string &s2);                        // 获取绝对值最大的字符串

  64.         std::string OppositeNumber(const std::string &s);        // 相反数
  65.         Number OppositeNumber(const Number &n);                        // 相反数
  66.         bool IsZero(const std::string &s);
  67.         Number AbsoluteValue(const Number &n);                        // 绝对值
  68.         std::string RemoveZero(const std::string &s);                // 去掉数字前面的0,例如 "010",去掉前面的0,变成 "10"
  69. };

  70. #endif
复制代码


Number.cpp
  1. #include "Number.hpp"

  2. Number::Number()
  3. {
  4. }

  5. Number::Number(const Number &s)
  6. {
  7.         this->num = s.num;
  8. }

  9. Number::Number(const std::string &s)
  10. {
  11.         this->num = s;
  12. }

  13. Number::Number(const char *s)
  14. {
  15.         this->num = std::string(s);
  16. }

  17. Number::~Number()
  18. {
  19. }

  20. Number::operator bool()
  21. {
  22.         if(this->IsZero(this->num))
  23.                 return false;
  24.         else
  25.                 return true;
  26. }

  27. bool Number::operator==(const Number &s)
  28. {
  29.         return *this == s.num;
  30. }

  31. bool Number::operator==(const std::string &s)
  32. {
  33.         return this->num == s;
  34. }

  35. bool Number::operator==(const char *s)
  36. {
  37.         return *this == std::string(s);
  38. }

  39. bool Number::operator!=(const Number &s)
  40. {
  41.         return !(*this == s);
  42. }

  43. bool Number::operator!=(const std::string &s)
  44. {
  45.         return !(*this == s);
  46. }

  47. bool Number::operator!=(const char *s)
  48. {
  49.         return !(*this == s);
  50. }

  51. bool Number::operator<(const Number &s)
  52. {
  53.         return *this < s.num;
  54. }

  55. bool Number::operator<(const std::string &s)
  56. {
  57.         Number n = *this - s;
  58.         if(n == "0")
  59.                 return false;
  60.         return !(this->IsPositiveNumber(n.num));
  61. }

  62. bool Number::operator<(const char *s)
  63. {
  64.         return *this < std::string(s);
  65. }

  66. bool Number::operator>(const Number &s)
  67. {
  68.         return *this > s.num;
  69. }

  70. bool Number::operator>(const std::string &s)
  71. {
  72.         Number n = *this - s;
  73.         if(n == "0")
  74.                 return false;
  75.         return this->IsPositiveNumber(n.num);
  76. }

  77. bool Number::operator>(const char *s)
  78. {
  79.         return *this > std::string(s);
  80. }

  81. Number Number::operator++()
  82. {
  83.         *this = *this + "1";
  84.         return *this;
  85. }

  86. Number Number::operator++(int)
  87. {
  88.         Number t(*this);
  89.         ++*this;
  90.         return t;
  91. }

  92. Number Number::operator--()
  93. {
  94.         *this = *this - "1";
  95.         return *this;
  96. }

  97. Number Number::operator--(int)
  98. {
  99.         Number t(*this);
  100.         --*this;
  101.         return t;
  102. }

  103. Number &Number::operator=(const Number &s)
  104. {
  105.         *this = s.num;
  106.         return *this;
  107. }

  108. Number &Number::operator=(const std::string &s)
  109. {
  110.         this->num = s;
  111.         return *this;
  112. }

  113. Number &Number::operator=(const char *s)
  114. {
  115.         *this = std::string(s);
  116.         return *this;
  117. }

  118. Number Number::operator+(const Number &s)
  119. {
  120.         return *this + s.num;
  121. }

  122. Number Number::operator+(const std::string &s)
  123. {
  124.         std::string sum;

  125.         if(*this == "0")
  126.                 return Number(s);
  127.         if(s == "0")
  128.                 return Number(*this);

  129.         bool b1 = this->IsPositiveNumber(this->num);
  130.         bool b2 = this->IsPositiveNumber(s);
  131.         if(b1 == b2)
  132.                 sum = this->SymbolEqualAdd(this->num, s);
  133.         else
  134.                 sum = this->SymbolNotEqualAdd(this->num, s);

  135.         return Number(sum);
  136. }

  137. Number Number::operator+(const char *s)
  138. {
  139.         return *this + std::string(s);
  140. }

  141. Number Number::operator-(const Number &s)
  142. {
  143.         return *this - s.num;
  144. }

  145. Number Number::operator-(const std::string &s)
  146. {
  147.         // 减一个数,等于加这个数的相反数
  148.         return *this + this->OppositeNumber(s);
  149. }

  150. Number Number::operator-(const char *s)
  151. {
  152.         return *this - std::string(s);
  153. }

  154. Number Number::operator*(const Number &s)
  155. {
  156.         return *this * s.num;
  157. }

  158. Number Number::operator*(const std::string &s)
  159. {
  160.         if(*this == "0")
  161.                 return Number("0");
  162.         if(s == "0")
  163.                 return Number("0");

  164.         Number a = this->AbsoluteValue(*this);
  165.         Number b = this->AbsoluteValue(Number(s));
  166.         Number result("0");
  167.         for(Number i = a; i != "0"; i = i - "1")
  168.         {
  169.                 result = result + b;
  170.         }

  171.         bool b1 = this->IsPositiveNumber(this->num);
  172.         bool b2 = this->IsPositiveNumber(s);
  173.         if(b1 == b2)
  174.                 return result;
  175.         else
  176.                 return this->OppositeNumber(result);
  177. }

  178. Number Number::operator*(const char *s)
  179. {
  180.         return *this * std::string(s);
  181. }

  182. Number Number::operator/(const Number &s)
  183. {
  184.         return *this / s.num;
  185. }

  186. Number Number::operator/(const std::string &s)
  187. {
  188.         if(this->IsZero(this->num))
  189.                 return Number("0");
  190.         if(this->IsZero(s))
  191.                 throw "除数为0";
  192.        
  193.         Number a = this->AbsoluteValue(*this);
  194.         Number b = this->AbsoluteValue(Number(s));

  195.         Number result;
  196.         for(result = "0"; result * b < a; result = result + "1")
  197.                 /* nothing */;

  198.         result = result - "1";

  199.         bool b1 = this->IsPositiveNumber(this->num);
  200.         bool b2 = this->IsPositiveNumber(s);
  201.         if(b1 == b2)
  202.                 return result;
  203.         else
  204.                 return this->OppositeNumber(result);
  205. }

  206. Number Number::operator/(const char *s)
  207. {
  208.         return *this / std::string(s);
  209. }

  210. Number Number::operator%(const Number &s)
  211. {
  212.         return *this % s.num;
  213. }

  214. Number Number::operator%(const std::string &s)
  215. {
  216.         Number n = *this / s;
  217.         return *this - n * s;
  218. }

  219. Number Number::operator%(const char *s)
  220. {
  221.         return *this % std::string(s);
  222. }

  223. Number Number::operator^(const Number &s)
  224. {
  225.         return *this ^ s.num;
  226. }

  227. Number Number::operator^(const std::string &s)
  228. {
  229.         Number b = this->AbsoluteValue(Number(s));
  230.         Number result = "1";
  231.         for(Number i = "0"; i < b; ++i)
  232.         {
  233.                 result = result * (*this);
  234.         }
  235.        
  236.         if(this->IsPositiveNumber(s))
  237.                 return result;
  238.         else
  239.                 return Number("1") / result;
  240. }

  241. Number Number::operator^(const char *s)
  242. {
  243.         return *this ^ std::string(s);
  244. }

  245. bool Number::IsPositiveNumber(const std::string &s)
  246. {
  247.         if(s[0] == '-')
  248.                 return false;
  249.         else
  250.                 return true;
  251. }

  252. std::string Number::SymbolEqualAdd(const std::string &s1, const std::string &s2)
  253. {
  254.         std::string sum = this->StringAdd(s1, s2);
  255.         if(this->IsPositiveNumber(s1))
  256.                 return sum;
  257.         else
  258.         {
  259.                 sum.insert(sum.begin(), '-');
  260.                 return sum;
  261.         }
  262. }

  263. #if 0
  264. std::string Number::SymbolNotEqualAdd(const std::string &s1, const std::string &s2)
  265. {
  266.         return this->StringSub(s1, s2);
  267. }
  268. #endif

  269. std::string Number::SymbolNotEqualAdd(const std::string &s1, const std::string &s2)
  270. {
  271.         std::string result = this->StringSub(s1, s2);
  272.         result = this->RemoveZero(result);

  273.         // 会出现 "000" 的情况,例如 100 + (-100)
  274.         // 对这类问题特殊处理
  275.         if(this->IsZero(result))
  276.                 return std::string("0");

  277.         const std::string *max = this->GetAbsoluteMaxString(s1, s2);
  278.         if(this->IsPositiveNumber(*max))
  279.                 return result;
  280.         else
  281.         {
  282.                 result.insert(result.begin(), '-');
  283.                 return result;
  284.         }
  285. }

  286. std::string Number::StringAdd(const std::string &s1, const std::string &s2)
  287. {       
  288.         auto i1_begin = s1.rbegin();
  289.         auto i1_end = s1.rend();
  290.         auto i2_begin = s2.rbegin();
  291.         auto i2_end = s2.rend();
  292.         if((*(i1_end - 1) == '-') || (*(i1_end - 1) == '+'))
  293.                 --i1_end;
  294.         if((*(i2_end - 1) == '-') || (*(i2_end - 1) == '+'))
  295.                 --i2_end;

  296.         std::string sum;
  297.         bool carry = false;                // 进位
  298.         while((i1_begin != i1_end) && (i2_begin != i2_end))
  299.         {
  300.                 int tmp = (*i1_begin - '0') + (*i2_begin - '0') + carry;
  301.                 sum.insert(sum.begin(), (tmp % 10) + '0');

  302.                 if(10 <= tmp)
  303.                         carry = true;
  304.                 else
  305.                         carry = false;

  306.                 ++i1_begin;
  307.                 ++i2_begin;
  308.         }
  309.        
  310.         while(i1_begin != i1_end)
  311.         {
  312.                 int tmp = (*i1_begin - '0') + carry;
  313.                 sum.insert(sum.begin(), (tmp % 10) + '0');
  314.                 if(10 <= tmp)
  315.                         carry = true;
  316.                 else
  317.                         carry = false;
  318.                 ++i1_begin;
  319.         }

  320.         while(i2_begin != i2_end)
  321.         {
  322.                 int tmp = (*i2_begin - '0') + carry;
  323.                 sum.insert(sum.begin(), (tmp % 10) + '0');
  324.                 if(10 <= tmp)
  325.                         carry = true;
  326.                 else
  327.                         carry = false;
  328.                 ++i2_begin;
  329.         }

  330.         if(carry)
  331.                 sum.insert(sum.begin(), '1');

  332.         return sum;
  333. }

  334. // 好吧,此函数无效,重写一个
  335. #if 0
  336. // StringSub 工作量太大了,也许应该分给 SymbolNotEqualAdd 一些?
  337. // 不想改了,目前就这样了
  338. std::string Number::StringSub(const std::string &s1, const std::string &s2)
  339. {
  340.         /*std::string::const_reverse_iterator i1_begin = this->GetMaxR_Iterator(s1, s2);
  341.         std::string::const_reverse_iterator i1_end;
  342.         std::string::const_reverse_iterator i2_begin;
  343.         std::string::const_reverse_iterator i2_end;*/
  344.        
  345.         // C++ 要如何判断迭代器所属的对象?
  346.         // 我也没有什么好方法, try catch 一下吧
  347.         /*try
  348.         {
  349.                 i1_begin == s1.rbegin();

  350.                 i1_end = s1.rend();
  351.                 i2_begin = s2.rbegin();
  352.                 i2_end = s2.rend();
  353.         }
  354.         catch(...)
  355.         {
  356.                 i1_end = s2.rend();
  357.                 i2_begin = s1.rbegin();
  358.                 i2_end = s1.rend();
  359.         }*/
  360.         // 好吧 try catch 也不行
  361.         // 就只是让 i1_begin 指向最大的字符串开始,i1_end 指向最大的字符串结尾
  362.         // i2_begin 指向最小的字符串开始,i2_end 指向最小的字符串结尾
  363.         // 这样的方法要多少有多少

  364.         /*if(i1_begin == s1.rbegin())
  365.         {
  366.                 i1_end = s1.rend();
  367.                 i2_begin = s2.rbegin();
  368.                 i2_end = s2.rend();
  369.         }
  370.         else
  371.         {
  372.                 i1_end = s2.rend();
  373.                 i2_begin = s1.rbegin();
  374.                 i2_end = s1.rend();
  375.         }*/

  376.         std::string::const_reverse_iterator i1_begin;
  377.         std::string::const_reverse_iterator i1_end;
  378.         std::string::const_reverse_iterator i2_begin;
  379.         std::string::const_reverse_iterator i2_end;

  380.         const std::string *s = this->GetMaxR_Iterator(s1, s2);
  381.         if(s == &s1)
  382.         {
  383.                 i1_begin = s1.rbegin();
  384.                 i1_end = s1.rend();
  385.                 i2_begin = s2.rbegin();
  386.                 i2_end = s2.rend();
  387.         }
  388.         else
  389.         {
  390.                 i1_begin = s2.rbegin();
  391.                 i1_end = s2.rend();
  392.                 i2_begin = s1.rbegin();
  393.                 i2_end = s1.rend();
  394.         }

  395.        


  396.         if((*(i1_end - 1) == '-') || (*(i1_end - 1) == '+'))
  397.                 --i1_end;
  398.         if((*(i2_end - 1) == '-') || (*(i2_end - 1) == '+'))
  399.                 --i2_end;

  400.         bool borrow = false;                // 借位
  401.         std::string result;
  402.         while((i1_begin != i1_end) && (i2_begin != i2_end))
  403.         {
  404.                 int tmp = (*i1_begin - '0') - (*i2_begin - '0') - borrow;
  405.                 if(tmp < 0)
  406.                 {
  407.                         borrow = true;
  408.                         tmp += 10;
  409.                 }
  410.                 else
  411.                 {
  412.                         borrow = false;
  413.                 }
  414.                 result.insert(result.begin(), tmp + '0');

  415.                 ++i1_begin;
  416.                 ++i2_begin;
  417.         }

  418.         while(i1_begin != i1_end)
  419.         {
  420.                 int tmp = (*i1_begin - '0') - borrow;
  421.                 if(tmp < 0)
  422.                 {
  423.                         borrow = true;
  424.                         tmp += 10;
  425.                 }
  426.                 else
  427.                 {
  428.                         borrow = false;
  429.                 }
  430.                 result.insert(result.begin(), tmp + '0');

  431.                 ++i1_begin;
  432.         }

  433.         while(i2_begin != i2_end)
  434.         {
  435.                 int tmp = (*i2_begin - '0') - borrow;
  436.                 if(tmp < 0)
  437.                 {
  438.                         borrow = true;
  439.                         tmp += 10;
  440.                 }
  441.                 else
  442.                 {
  443.                         borrow = false;
  444.                 }
  445.                 result.insert(result.begin(), tmp + '0');

  446.                 ++i2_begin;
  447.         }

  448.         const std::string *max;
  449.         if(s == &s1)
  450.                 max = &s1;
  451.         else
  452.                 max = &s2;
  453.         /*if(i1_begin == s1.rbegin())
  454.                 max = &s1;
  455.         else
  456.                 max = &s2;*/

  457.         if(this->IsPositiveNumber(*max))
  458.         {
  459.                 return result;
  460.         }
  461.         else
  462.         {
  463.                 result.insert(result.begin(), '-');
  464.                 return result;
  465.         }
  466. }
  467. #endif

  468. // 绝对值大的减绝对值小的,不管符号
  469. std::string Number::StringSub(const std::string &s1, const std::string &s2)
  470. {
  471.         std::string::const_reverse_iterator i1_begin;
  472.         std::string::const_reverse_iterator i1_end;
  473.         std::string::const_reverse_iterator i2_begin;
  474.         std::string::const_reverse_iterator i2_end;

  475.         const std::string *max = this->GetAbsoluteMaxString(s1, s2);
  476.         if(max == &s1)
  477.         {
  478.                 i1_begin = s1.rbegin();
  479.                 i1_end = s1.rend();
  480.                 i2_begin = s2.rbegin();
  481.                 i2_end = s2.rend();
  482.         }
  483.         else
  484.         {
  485.                 i1_begin = s2.rbegin();
  486.                 i1_end = s2.rend();
  487.                 i2_begin = s1.rbegin();
  488.                 i2_end = s1.rend();
  489.         }

  490.         if((*(i1_end - 1) == '-') || (*(i1_end - 1) == '+'))
  491.                 --i1_end;
  492.         if((*(i2_end - 1) == '-') || (*(i2_end - 1) == '+'))
  493.                 --i2_end;

  494.         bool borrow = false;                // 借位
  495.         std::string result;
  496.         while((i1_begin != i1_end) && (i2_begin != i2_end))
  497.         {
  498.                 int tmp = (*i1_begin - '0') - (*i2_begin - '0') - borrow;
  499.                 if(tmp < 0)
  500.                 {
  501.                         borrow = true;
  502.                         tmp += 10;
  503.                 }
  504.                 else
  505.                 {
  506.                         borrow = false;
  507.                 }
  508.                 result.insert(result.begin(), tmp + '0');

  509.                 ++i1_begin;
  510.                 ++i2_begin;
  511.         }

  512.         while(i1_begin != i1_end)
  513.         {
  514.                 int tmp = (*i1_begin - '0') - borrow;
  515.                 if(tmp < 0)
  516.                 {
  517.                         borrow = true;
  518.                         tmp += 10;
  519.                 }
  520.                 else
  521.                 {
  522.                         borrow = false;
  523.                 }
  524.                 result.insert(result.begin(), tmp + '0');

  525.                 ++i1_begin;
  526.         }

  527.         while(i2_begin != i2_end)
  528.         {
  529.                 int tmp = (*i2_begin - '0') - borrow;
  530.                 if(tmp < 0)
  531.                 {
  532.                         borrow = true;
  533.                         tmp += 10;
  534.                 }
  535.                 else
  536.                 {
  537.                         borrow = false;
  538.                 }
  539.                 result.insert(result.begin(), tmp + '0');

  540.                 ++i2_begin;
  541.         }

  542.         return result;
  543. }


  544. //std::string::const_reverse_iterator Number::GetMaxR_Iterator(const std::string &s1, const std::string &s2)
  545. //{
  546. //        size_t len1 = s1.size();
  547. //        size_t len2 = s2.size();
  548. //        if((s1[0] == '-') || (s1[0] == '+'))
  549. //                --len1;
  550. //        if((s2[0] == '-') || (s2[0] == '+'))
  551. //                --len2;
  552. //       
  553. //        if(len1 == len2)
  554. //        {
  555. //                auto i1_begin = s1.rbegin();
  556. //                auto i1_end = s1.rend();
  557. //                auto i2_begin = s2.rbegin();
  558. //                auto i2_end = s2.rend();
  559. //                if((*(i1_end - 1) == '-') || (*(i1_end - 1) == '+'))
  560. //                        --i1_end;
  561. //                if((*(i2_end - 1) == '-') || (*(i2_end - 1) == '+'))
  562. //                        --i2_end;
  563. //
  564. //                if(std::string(i1_begin, i1_end) > std::string(i2_begin, i2_end))
  565. //                        return s1.rbegin();
  566. //                else
  567. //                        return s2.rbegin();
  568. //        }
  569. //        else
  570. //        {
  571. //                if(len1 > len2)
  572. //                        return s1.rbegin();
  573. //                else
  574. //                        return s2.rbegin();
  575. //        }
  576. //}

  577. //const std::string *Number::GetMaxR_Iterator(const std::string &s1, const std::string &s2)
  578. //{
  579. //        size_t len1 = s1.size();
  580. //        size_t len2 = s2.size();
  581. //        if((s1[0] == '-') || (s1[0] == '+'))
  582. //                --len1;
  583. //        if((s2[0] == '-') || (s2[0] == '+'))
  584. //                --len2;
  585. //
  586. //        if(len1 == len2)
  587. //        {
  588. //                auto i1_begin = s1.rbegin();
  589. //                auto i1_end = s1.rend();
  590. //                auto i2_begin = s2.rbegin();
  591. //                auto i2_end = s2.rend();
  592. //                if((*(i1_end - 1) == '-') || (*(i1_end - 1) == '+'))
  593. //                        --i1_end;
  594. //                if((*(i2_end - 1) == '-') || (*(i2_end - 1) == '+'))
  595. //                        --i2_end;
  596. //
  597. //                if(std::string(i1_begin, i1_end) > std::string(i2_begin, i2_end))
  598. //                        return &s1;
  599. //                else
  600. //                        return &s2;
  601. //        }
  602. //        else
  603. //        {
  604. //                if(len1 > len2)
  605. //                        return &s1;
  606. //                else
  607. //                        return &s2;
  608. //        }
  609. //}

  610. const std::string * Number::GetAbsoluteMaxString(const std::string & s1, const std::string & s2)
  611. {
  612.                 size_t len1 = s1.size();
  613.                 size_t len2 = s2.size();
  614.                 if((s1[0] == '-') || (s1[0] == '+'))
  615.                         --len1;
  616.                 if((s2[0] == '-') || (s2[0] == '+'))
  617.                         --len2;
  618.        
  619.                 if(len1 == len2)
  620.                 {
  621.                         std::string::const_iterator i1 = s1.begin();
  622.                         std::string::const_iterator i2 = s2.begin();
  623.                         if((*i1 == '-') || (*i1 == '+'))
  624.                                 ++i1;
  625.                         if((*i2 == '-') || (*i2 == '+'))
  626.                                 ++i2;
  627.        
  628.                         if(std::string(i1, s1.end()) > std::string(i2, s2.end()))
  629.                                 return &s1;
  630.                         else
  631.                                 return &s2;
  632.                 }
  633.                 else
  634.                 {
  635.                         if(len1 > len2)
  636.                                 return &s1;
  637.                         else
  638.                                 return &s2;
  639.                 }
  640. }

  641. //std::string &Number::DebugGetNum(void)
  642. //{
  643. //        return this->num;
  644. //}

  645. std::string Number::OppositeNumber(const std::string &s)
  646. {
  647.         std::string result(s);
  648.         if(this->IsPositiveNumber(result))
  649.         {
  650.                 if(result[0] == '+')
  651.                         result[0] = '-';
  652.                 else
  653.                         result.insert(result.begin(), '-');
  654.         }
  655.         else
  656.         {
  657.                 result.erase(result.begin());
  658.         }

  659.         return result;
  660. }

  661. Number Number::OppositeNumber(const Number &n)
  662. {
  663.         return Number(this->OppositeNumber(n.num));
  664. }

  665. bool Number::IsZero(const std::string &s)
  666. {
  667.         for(auto iter = s.begin(); iter != s.end(); ++iter)
  668.         {
  669.                 if(*iter != '0')
  670.                         return false;
  671.         }
  672.         return true;
  673. }

  674. Number Number::AbsoluteValue(const Number &n)
  675. {
  676.         if(this->IsPositiveNumber(n.num))
  677.                 return Number(n);
  678.         else
  679.                 return Number(this->OppositeNumber(n.num));
  680. }

  681. std::string Number::RemoveZero(const std::string &s)
  682. {
  683.         std::string result(s);
  684.         while(!result.empty())
  685.         {
  686.                 if(result[0] != '0')
  687.                         break;
  688.                 else
  689.                         result.erase(result.begin());
  690.         }

  691.         if(!result.empty())
  692.                 return result;
  693.         else
  694.                 return std::string("0");
  695. }

  696. std::ostream &operator<<(std::ostream &out, const Number &n)
  697. {
  698.         out << n.num;
  699.         return out;
  700. }

  701. #if 0
  702. int main()
  703. {
  704.         std::string num = "100";

  705.         Number n1 = "1234";
  706.         Number n2("1234");
  707.         Number n3 = num;
  708.         Number n4(num);
  709.         Number n5 = n4;

  710.         n1 == n2;
  711.         n1 == num;
  712.         n1 == "123";

  713.         n1 = num;
  714.         n1 = n2 = "100";

  715.         n1 + n2;
  716.         n1 + num;
  717.         n1 + "123";

  718. #if 0
  719.         num = n1.StringAdd("1234", "56");
  720.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  721.         num = n1.StringAdd("1234", "567890");
  722.         std::cout << num << "\t" << 1234 + 567890 << std::endl;
  723.         num = n1.StringAdd("-1234", "56");
  724.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  725.         num = n1.StringAdd("1234", "-56");
  726.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  727.         num = n1.StringAdd("+1234", "56");
  728.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  729.         num = n1.StringAdd("1234", "+56");
  730.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  731.         num = n1.StringAdd("-1234", "-56");
  732.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  733.         num = n1.StringAdd("-1234", "+56");
  734.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  735.         num = n1.StringAdd("+1234", "-56");
  736.         std::cout << num << "\t" << 1234 + 56 << std::endl;
  737.         num = n1.StringAdd("+1234", "+56");
  738.         std::cout << num << "\t" << 1234 + 56 << std::endl;

  739.         n1 = "-1234";
  740.         n2 = "-456789";
  741.         n3 = n1 + n2;

  742.         std::cout << (-1234) + (-456789) << std::endl;



  743.         num = n1.StringSub("1234", "56");
  744.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  745.         num = n1.StringSub("1234", "567890");
  746.         std::cout << num << "\t" << 567890 - 1234 << std::endl;
  747.         num = n1.StringSub("-1234", "56");
  748.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  749.         num = n1.StringSub("1234", "-56");
  750.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  751.         num = n1.StringSub("+1234", "56");
  752.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  753.         num = n1.StringSub("1234", "+56");
  754.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  755.         num = n1.StringSub("-1234", "-56");
  756.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  757.         num = n1.StringSub("-1234", "+56");
  758.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  759.         num = n1.StringSub("+1234", "-56");
  760.         std::cout << num << "\t" << 1234 - 56 << std::endl;
  761.         num = n1.StringSub("+1234", "+56");
  762.         std::cout << num << "\t" << 1234 - 56 << std::endl;

  763.         n2 = "1234";
  764.         n3 = "56";
  765.         n1 = n2 + n3;
  766.         std::cout << n1.DebugGetNum() << "\t" << 1234 + 56 << std::endl;
  767.         n2 = "1234";
  768.         n3 = "567890";
  769.         n1 = n2 + n3;
  770.         std::cout << n1.DebugGetNum() << "\t" << 1234 + 567890 << std::endl;
  771.         n2 = "-1234";
  772.         n3 = "56";
  773.         n1 = n2 + n3;
  774.         std::cout << n1.DebugGetNum() << "\t" << (-1234) + 56 << std::endl;
  775.         n2 = "1234";
  776.         n3 = "-56";
  777.         n1 = n2 + n3;
  778.         std::cout << n1.DebugGetNum() << "\t" << 1234 + (-56) << std::endl;
  779.         n2 = "+1234";
  780.         n3 = "56";
  781.         n1 = n2 + n3;
  782.         std::cout << n1.DebugGetNum() << "\t" << 1234 + 56 << std::endl;
  783.         n2 = "1234";
  784.         n3 = "+56";
  785.         n1 = n2 + n3;
  786.         std::cout << n1.DebugGetNum() << "\t" << 1234 + 56 << std::endl;
  787.         n2 = "-1234";
  788.         n3 = "-56";
  789.         n1 = n2 + n3;
  790.         std::cout << n1.DebugGetNum() << "\t" << (-1234) + (-56) << std::endl;
  791.         n2 = "-1234";
  792.         n3 = "+56";
  793.         n1 = n2 + n3;
  794.         std::cout << n1.DebugGetNum() << "\t" << (-1234) + 56 << std::endl;
  795.         n2 = "+1234";
  796.         n3 = "+56";
  797.         n1 = n2 + n3;
  798.         std::cout << n1.DebugGetNum() << "\t" << 1234 + 56 << std::endl;
  799.         n2 = "+1234";
  800.         n3 = "-56";
  801.         n1 = n2 + n3;
  802.         std::cout << n1.DebugGetNum() << "\t" << 1234 + (-56) << std::endl;


  803.         n2 = "1234";
  804.         n3 = "56";
  805.         n1 = n2 - n3;
  806.         std::cout << n1.DebugGetNum() << "\t" << 1234 - 56 << std::endl;
  807.         n2 = "1234";
  808.         n3 = "567890";
  809.         n1 = n2 - n3;
  810.         std::cout << n1.DebugGetNum() << "\t" << 1234 - 567890 << std::endl;
  811.         n2 = "-1234";
  812.         n3 = "56";
  813.         n1 = n2 - n3;
  814.         std::cout << n1.DebugGetNum() << "\t" << (-1234) - 56 << std::endl;
  815.         n2 = "1234";
  816.         n3 = "-56";
  817.         n1 = n2 - n3;
  818.         std::cout << n1.DebugGetNum() << "\t" << 1234 - (-56) << std::endl;
  819.         n2 = "+1234";
  820.         n3 = "56";
  821.         n1 = n2 - n3;
  822.         std::cout << n1.DebugGetNum() << "\t" << 1234 - 56 << std::endl;
  823.         n2 = "1234";
  824.         n3 = "+56";
  825.         n1 = n2 - n3;
  826.         std::cout << n1.DebugGetNum() << "\t" << 1234 - 56 << std::endl;
  827.         n2 = "-1234";
  828.         n3 = "-56";
  829.         n1 = n2 - n3;
  830.         std::cout << n1.DebugGetNum() << "\t" << (-1234) - (-56) << std::endl;
  831.         n2 = "-1234";
  832.         n3 = "+56";
  833.         n1 = n2 - n3;
  834.         std::cout << n1.DebugGetNum() << "\t" << (-1234) - 56 << std::endl;
  835.         n2 = "+1234";
  836.         n3 = "+56";
  837.         n1 = n2 - n3;
  838.         std::cout << n1.DebugGetNum() << "\t" << 1234 - 56 << std::endl;
  839.         n2 = "+1234";
  840.         n3 = "-56";
  841.         n1 = n2 - n3;
  842.         std::cout << n1.DebugGetNum() << "\t" << 1234 - (-56) << std::endl;


  843.         n1 != n2;
  844.         n1 != num;
  845.         n1 != "1234";

  846.         n2 = "3";
  847.         n1 = n2 * "4";

  848.         std::cout << Number("1234") * Number("56") << "\t" << 1234 * 56 << std::endl;
  849.         std::cout << Number("1234") * Number("567890") << "\t" << 1234 * 567890 << std::endl;
  850.         std::cout << Number("-1234") * Number("56") << "\t" << (-1234) * 56 << std::endl;
  851.         std::cout << Number("1234") * Number("-56") << "\t" << 1234 * (-56) << std::endl;
  852.         std::cout << Number("+1234") * Number("56") << "\t" << 1234 * 56 << std::endl;
  853.         std::cout << Number("1234") * Number("+56") << "\t" << 1234 * 56 << std::endl;
  854.         std::cout << Number("-1234") * Number("-56") << "\t" << (-1234) * (-56) << std::endl;
  855.         std::cout << Number("-1234") * Number("+56") << "\t" << (-1234) * 56 << std::endl;
  856.         std::cout << Number("+1234") * Number("-56") << "\t" << 1234 * (-56) << std::endl;
  857.         std::cout << Number("+1234") * Number("+56") << "\t" << 1234 * 56 << std::endl;

  858.         n1 - n2;
  859.         n1 - num;
  860.         n1 - "123";

  861.         n1 * n2;
  862.         n1 * num;
  863.         n1 * "123";

  864.         n1 / n2;
  865.         n1 / num;
  866.         n1 / "123";

  867.         if(Number("1"))
  868.                 std::wcout << "1" << std::endl;
  869.         if(Number("0"))
  870.                 std::wcout << "0" << std::endl;
  871.         if(Number("123"))
  872.                 std::wcout << "123" << std::endl;


  873.         std::cout << Number("10") / Number("3") << "\t" << 10 / 3 << std::endl;

  874.         std::cout << Number("1234") / Number("56") << "\t" << 1234 / 56 << std::endl;
  875.         std::cout << Number("1234") / Number("567890") << "\t" << 1234 / 567890 << std::endl;
  876.         std::cout << Number("-1234") / Number("56") << "\t" << (-1234) / 56 << std::endl;
  877.         std::cout << Number("1234") / Number("-56") << "\t" << 1234 / (-56) << std::endl;
  878.         std::cout << Number("+1234") / Number("56") << "\t" << 1234 / 56 << std::endl;
  879.         std::cout << Number("1234") / Number("+56") << "\t" << 1234 / 56 << std::endl;
  880.         std::cout << Number("-1234") / Number("-56") << "\t" << (-1234) / (-56) << std::endl;
  881.         std::cout << Number("-1234") / Number("+56") << "\t" << (-1234) / 56 << std::endl;
  882.         std::cout << Number("+1234") / Number("-56") << "\t" << 1234 / (-56) << std::endl;
  883.         std::cout << Number("+1234") / Number("+56") << "\t" << 1234 / 56 << std::endl;

  884.         n1 % n2;
  885.         n1 % num;
  886.         n1 % "123";

  887.         std::cout << Number("10") % Number("3") << "\t" << 10 % 3 << std::endl;

  888.         std::cout << Number("1234") % Number("56") << "\t" << 1234 % 56 << std::endl;
  889.         std::cout << Number("1234") % Number("567890") << "\t" << 1234 % 567890 << std::endl;
  890.         std::cout << Number("-1234") % Number("56") << "\t" << (-1234) % 56 << std::endl;
  891.         std::cout << Number("1234") % Number("-56") << "\t" << 1234 % (-56) << std::endl;
  892.         std::cout << Number("+1234") % Number("56") << "\t" << 1234 % 56 << std::endl;
  893.         std::cout << Number("1234") % Number("+56") << "\t" << 1234 % 56 << std::endl;
  894.         std::cout << Number("-1234") % Number("-56") << "\t" << (-1234) % (-56) << std::endl;
  895.         std::cout << Number("-1234") % Number("+56") << "\t" << (-1234) % 56 << std::endl;
  896.         std::cout << Number("+1234") % Number("-56") << "\t" << 1234 % (-56) << std::endl;
  897.         std::cout << Number("+1234") % Number("+56") << "\t" << 1234 % 56 << std::endl;


  898.         n1 = "2";
  899.         n2 = "10";
  900.         num = "10";
  901.         n1 ^ n2;
  902.         n1 ^ num;
  903.         n1 ^ "10";

  904.         std::cout << (Number("2") ^ Number("10")) << "\t" << pow(2, 10) << std::endl;
  905.         std::cout << (Number("10") ^ Number("2")) << "\t" << pow(10, 2) << std::endl;
  906.         std::cout << (Number("-2") ^ Number("10")) << "\t" << pow(-2, 10) << std::endl;
  907.         std::cout << (Number("2") ^ Number("-10")) << "\t" << pow(2, -10) << std::endl;
  908.         std::cout << (Number("+2") ^ Number("10")) << "\t" << pow(2, 10) << std::endl;
  909.         std::cout << (Number("2") ^ Number("+10")) << "\t" << pow(2, 10) << std::endl;
  910.         std::cout << (Number("-2") ^ Number("-10")) << "\t" << pow(-2, -10) << std::endl;
  911.         std::cout << (Number("-2") ^ Number("+10")) << "\t" << pow(-2, 10) << std::endl;
  912.         std::cout << (Number("+2") ^ Number("+10")) << "\t" << pow(2, 10) << std::endl;
  913.         std::cout << (Number("+2") ^ Number("-10")) << "\t" << pow(2, -10) << std::endl;
  914. #endif
  915.         return 0;
  916. }

  917. #endif
复制代码


main.cpp
  1. #include <iostream>
  2. #include "Number.hpp"

  3. int main()
  4. {
  5.         std::cout << (Number("2") ^ Number("10")) << std::endl;                // 2的10次方
  6.         std::cout << (Number("2") ^ Number("16")) << std::endl;
  7.         return 0;
  8. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 14:09:28 | 显示全部楼层
附上源文件吧
Number.zip (4.53 KB, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 22:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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