鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[技术交流] 任意长度的大数加法(栈的应用)

  [复制链接]
发表于 2013-7-27 20:03:59 | 显示全部楼层
:lol:lol:lol:lol支持甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-28 11:11:07 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-29 21:47:45 | 显示全部楼层
必须顶上这种高端霸气上档次的题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-4 18:45:59 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-4 19:39:53 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-22 10:07:47 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-25 00:45:38 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-20 15:16:05 | 显示全部楼层
太生气了,无法HOLD啦 >_<......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-20 16:17:19 | 显示全部楼层
激动人心,无法言表!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-5 21:16:55 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-5 00:08:54 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-6 21:15:14 | 显示全部楼层
应该是模拟笔算得出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-6 21:19:31 | 显示全部楼层
其实不用以#为结束标志,以\n为结束标志不就行了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-6 21:22:30 | 显示全部楼层
我用C++实现行么?我都自己写了一个Stack类了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-7 12:55:32 | 显示全部楼层
  1. #ifndef STACK_H_
  2. #define STACK_H_
  3. #include <new>
  4. #include <initializer_list> //initializer_list是C++11新增的模板类

  5. template <typename T>
  6. class Stack
  7. {
  8.         private:
  9.                 T * base;
  10.                 T * top;
  11.                 unsigned int StackSize; //表示栈内剩余容量
  12.         public:
  13.                 Stack(const unsigned int size, const T * begin, const T * end);
  14.                 Stack(const unsigned int size, const T arr[], const int n);
  15.                 Stack(const unsigned int size, const std::initializer_list<T> & l);
  16.                 Stack(const unsigned int size = 100);
  17.                 ~Stack() {delete [] base;}
  18.                 bool Push(const T & item);
  19.                 bool Pop(T & e);
  20.                 bool Clear();
  21.                 bool Is_Empty()const {return base == top;}
  22.                 unsigned int Remaining()const {return StackSize;}
  23.                 unsigned int StackLen()const {return top - base;}
  24.                 unsigned int Size()const {return StackSize + (top - base);}
  25. };

  26. template <typename T>
  27. Stack<T>::Stack(const unsigned int size, const T * begin, const T * end) : StackSize(size)
  28. {
  29.         if (StackSize < end - begin)
  30.                 StackSize = end - begin;
  31.         try {
  32.         base = top = new T[StackSize];
  33.         }
  34.         catch (std::bad_alloc & ba) {
  35.                 base = top = nullptr;
  36.                 StackSize = 0;
  37.                 throw;
  38.         }
  39.         for (T * p = begin; p != end; p++)
  40.                 Push(*p);
  41. }

  42. template <typename T>
  43. Stack<T>::Stack(const unsigned int size, const T arr[], const int n) : StackSize(size)
  44. {
  45.         if (StackSize < n)
  46.                 StackSize = n + 1;
  47.         try {
  48.                 base = top = new T[StackSize];
  49.         }
  50.         catch (std::bad_alloc & ba) {
  51.                 base = top = nullptr;
  52.                 StackSize = 0;
  53.                 throw;
  54.         }
  55.         for (int i = 0; i < n; i++)
  56.                 Push(arr[i]);
  57. }

  58. template <typename T>
  59. Stack<T>::Stack(const unsigned int size, const std::initializer_list<T> & l) : StackSize(size)
  60. { //initializer_list是C++11新增的模板类
  61.         int i = 0;
  62.         try{
  63.                 base = top = new T[StackSize];
  64.         }
  65.         catch (std::bad_alloc & ba) {
  66.                 base = top = nullptr;
  67.                 StackSize = 0;
  68.                 throw;
  69.         }
  70.         for (auto p = l.begin(); p != l.end(); p++, i++)
  71.                 Push(*p);
  72. }

  73. template <typename T>
  74. Stack<T>::Stack(const unsigned int size) : StackSize(size)
  75. {
  76.         try {
  77.         base = top = new T[StackSize];
  78.         }
  79.         catch (std::bad_alloc & ba) {
  80.                 base = top = nullptr;
  81.                 StackSize = 0;
  82.                 throw;
  83.         }
  84. }

  85. template <typename T>
  86. bool Stack<T>::Push(const T & item)
  87. {
  88.         if (StackSize == 0)
  89.         {
  90.                 T * temp = base;
  91.                 unsigned int size = top - base;
  92.                 StackSize = size + 10;
  93.                 try {
  94.                         base = top = new T[StackSize];
  95.                 }
  96.                 catch (std::bad_alloc & ba) {
  97.                         StackSize = 0;
  98.                         base = top = nullptr;
  99.                         delete [] temp;
  100.                         return false;
  101.                 }
  102.                 for (int i = 0; i < size; i++)
  103.                         Push(temp[i]);
  104.                 Push(item);
  105.                 delete [] temp;
  106.                 return true;
  107.         }
  108.         *(top++) = item;
  109.         StackSize--;
  110.         return true;
  111. }

  112. template <typename T>
  113. bool Stack<T>::Pop(T & e)
  114. {
  115.         if (top && !Is_Empty())
  116.         {
  117.         e = *(--top);
  118.         StackSize++;
  119.         return true;
  120.         }
  121.         return false;
  122. }

  123. template <typename T>
  124. bool Stack<T>::Clear()
  125. {
  126.         if(top)
  127.         {
  128.         StackSize += top - base;
  129.         top = base;
  130.         return true;
  131.         }       
  132.         return false;
  133. }

  134. #endif
复制代码
Stack.h头文件,需要编译器支持C++11
下面是实现代码
  1. #include <iostream>
  2. #include <string>
  3. #include <cctype>
  4. #include "Stack.h"

  5. int main()
  6. {
  7.         using std::cout;
  8.         using std::endl;
  9.         using std::cin;
  10.        
  11.         cout << "请输入第一个数: ";
  12.        
  13.         char ch;
  14.         Stack<char> num1(10);
  15.         Stack<char> num2(10);
  16.         Stack<int> sum(10);
  17.         std::string buffer;
  18.         std::string buffer2;
  19.        
  20.         cin.get(ch);
  21.         while (ch != '\n')
  22.         {
  23.                 if (std::isdigit(ch))
  24.                         buffer += ch;
  25.                 cin.get(ch);
  26.         }
  27.         int len = buffer.size();
  28.        
  29.         cout << "请输入第二个数: ";
  30.         cin.get(ch);
  31.         while (ch != '\n')
  32.         {
  33.                 if (std::isdigit(ch))
  34.                         buffer2 += ch;
  35.                 cin.get(ch);
  36.         }
  37.         int len2 = buffer2.size();
  38.        
  39.         int max = len > len2 ? len : len2;
  40.         int min = len < len2 ? len : len2;
  41.        
  42.         int difference = max - min;
  43.        
  44.         if (max == len)
  45.                 for (int i= 0; i < difference; i++)
  46.                         num2.Push('0');
  47.         else
  48.                 for (int i= 0; i < difference; i++)
  49.                         num1.Push('0');
  50.                                
  51.         for (int i = 0; i < len; i++)
  52.                 num1.Push(buffer[i]);
  53.         for (int i = 0; i < len2; i++)
  54.                 num2.Push(buffer2[i]);
  55.        
  56.         int carry = 0;
  57.        
  58.         while (!num1.Is_Empty())
  59.         {
  60.                 char c1;
  61.                 char c2;
  62.                 int n1;
  63.                 int n2;
  64.                 int rem;
  65.                 num1.Pop(c1);
  66.                 num2.Pop(c2);
  67.                 n1 = c1 - 48;
  68.                 n2 = c2 - 48;
  69.                 n1 += n2 + carry;
  70.                 carry = n1 / 10;
  71.                 rem = n1 % 10;
  72.                 sum.Push(rem);
  73.                 if (num1.Is_Empty() && carry)
  74.                         sum.Push(carry);
  75.         }
  76.        
  77.         cout << "两数相加的结果是: ";
  78.         while (!sum.Is_Empty())
  79.         {
  80.                 int temp;
  81.                 sum.Pop(temp);
  82.                 cout << temp;
  83.         }
  84.         cout << endl;
  85.                
  86.         return 0;
  87. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-16 22:30:01 | 显示全部楼层
淡定,淡定,淡定……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-16 22:30:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-21 19:01:13 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-22 09:30:03 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-25 22:59:02 | 显示全部楼层
看看什么样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 16:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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