字符串大数加减运算问题

Posted wxdjss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串大数加减运算问题相关的知识,希望对你有一定的参考价值。

这里自己利用STL模板中的容器和链表实现字符串大数加减运算.

  1 #include<iostream>
  2 #include<vector>
  3 #include<list>
  4 using namespace std;
  5 
  6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符
  7 {
  8     cout<<"please Input string ,end up with the \'#\'!"<<endl;
  9     char s;
 10     cin>>s;
 11     while(s!=\'#\')
 12     {
 13         ilist.push_back(s);
 14         cin>>s;
 15     }
 16     return ilist;
 17 }
 18 
 19 void print(list<char> ilist)//打印链表
 20 {
 21     list<char>::iterator ite;
 22     for(ite=ilist.begin();ite!=ilist.end();ite++)
 23         cout<<*ite;
 24     cout<<endl;
 25 }
 26 
 27 void Add(list<char>& ilist1,list<char>& ilist2)//字符串数字‘+’运算
 28 {
 29     int small_size=ilist1.size();//较小链表长度
 30     int big_size=ilist2.size();//较长链表长度
 31     list<char> ilist=ilist2;//ilist始终为最长链表
 32     list<char>::iterator ivlist1=ilist1.end();//链表迭代器指向ilist链尾
 33     list<char>::iterator ivlist2=ilist2.end();
 34 
 35     if(small_size>big_size)
 36     {
 37         ilist=ilist1;
 38         small_size=ilist2.size();
 39         big_size=ilist1.size();
 40     }
 41 
 42     vector<char> iv(big_size+1,\'0\');//给容器开辟big_size+1个空间,并初始化;
 43     for(int i=0;i<small_size;i++)//先遍历较小链表长度
 44     {
 45         iv[big_size-i] +=*(--ivlist1)+*(--ivlist2)-2*\'0\';
 46         ilist.pop_back();
 47         if(iv[big_size-i]>\'9\')
 48         {
 49             iv[big_size-i] -=10;
 50             iv[big_size-i-1]=\'1\';
 51         }
 52     }
 53     for(i=small_size;i<big_size;i++)//从上次断开处,继续遍历较长链表长度
 54     {
 55         iv[big_size-i] +=ilist.back()-\'0\';
 56         ilist.pop_back();
 57         if(iv[big_size-i]>\'9\')
 58         {
 59             iv[big_size-i] -=10;
 60             iv[big_size-i-1]=\'1\';
 61         }
 62 
 63     }
 64         if(iv[0]==\'0\')//如果首字符没有进位,进行首字符删除工作
 65             iv.erase(iv.begin());
 66         vector<char>::iterator ite;//容器iv结果输出
 67         for(ite=iv.begin();ite!=iv.end();ite++)
 68             cout<<*ite;
 69             cout<<endl;
 70 }
 71 
 72 int Cmp(list<char>& ilist1,list<char>& ilist2)//字符串大小比较函数
 73 {
 74     list<char>::iterator ite1=ilist1.begin();
 75     list<char>::iterator ite2=ilist2.begin();
 76     bool flag;
 77     if(ilist1.size()>ilist2.size())
 78         flag=true;
 79     if(ilist1.size()<ilist2.size())
 80         flag=false;
 81     if(ilist1.size()==ilist2.size())
 82     {
 83        while(*ite1==*ite2)
 84        {
 85          *ite1++;
 86          *ite2++;
 87          if(ite1==ilist1.end())
 88          break;
 89        }
 90           flag=(*ite1>=*ite2) ? true : false;
 91 
 92     }
 93     return flag;
 94 }     
 95 
 96 
 97 void Sub(list<char>ilist1,list<char> ilist2)
 98 {
 99     int flag;
100     int big_size=ilist1.size();
101     int small_size=ilist2.size();
102     list<char> ilist_big;//最大链表
103     list<char> ilist_small;//最小链表
104 
105     if(Cmp(ilist1,ilist2))
106     {
107         ilist_big=ilist1;
108         ilist_small=ilist2;
109         flag=1;//输出结果为\'+\'标志
110     }
111     else
112     {
113         ilist_big=ilist2;
114         ilist_small=ilist1;
115         big_size=ilist2.size();
116         small_size=ilist1.size();
117         flag=0;//输出结果为\'-\'标志
118 
119     }
120     list<char>::iterator ivlist1=ilist_big.end();
121     list<char>::iterator ivlist2=ilist_small.end();
122     vector<char> iv(big_size,\'0\');//分配big_size个内存大小,初始都为\'0\';
123 
124     //计算差值的绝对值
125     for(int i=0;i<small_size;i++)
126     {
127         iv[big_size-i-1] +=(*(--ivlist1)-*(--ivlist2));
128         if(iv[big_size-i-1]<\'0\')
129         {
130             iv[big_size-i-1] +=10;
131             iv[big_size-i-2] -=1;
132         }
133     }
134     list<char>::iterator ito=ivlist1;
135         for(i=small_size;i<big_size;i++)
136     {
137         iv[big_size-i-1] +=*(--ivlist1)-\'0\';
138         if(iv[big_size-i-1]<\'0\')
139         {
140             iv[big_size-i-1] +=10;
141             iv[big_size-i-2] -=1;
142         }
143 
144     }
145         while(*iv.begin()==\'0\'&&iv.size()>1)
146         {iv.erase(iv.begin());}
147         if(flag==0)
148         iv.insert(iv.begin(),1,\'-\');
149         vector<char>::iterator ite;
150         for(ite=iv.begin();ite!=iv.end();ite++)
151             cout<<*ite;
152         cout<<endl;
153 }
154 
155 
157 void main()
158 {
159     list<char> ilist1;
160     list<char> ilist2;
161     list<char> list1=Input_Number(ilist1);
162     list<char> list2=Input_Number(ilist2);
163     print(list1);
164     cout<<"+"<<endl;
165     print(list2);
166     Add(list1,list2);
167     cout<<endl;
168     print(list1);
169     cout<<"-"<<endl;
170     print(list2);
171     Sub(list1,list2);
172 }

结果:

以上是关于字符串大数加减运算问题的主要内容,如果未能解决你的问题,请参考以下文章

c++实现大数加减乘除四则运算

大数加减法 - java实现

大数运算实现加减乘除四则运算

大数加减运算

Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现

C++ 大数运算(加减乘除取模)