字符串大数加减运算问题

这里自己利用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 }

结果:

时间: 2024-12-23 07:09:44

字符串大数加减运算问题的相关文章

大数加减运算

1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 void BDplus(string str1, string str2) 7 { 8 int len1 = str1.length(); 9 int len2 = str2.length(); 10 char *value = NULL; 11 if (len1 >= len2) 12 { 13 //value= (char*)mallo

【算法】大数加减

超长的整型加减法可以用数组int来存储,每个单元可以存储1~9位数字,然后模拟手算过程 大数乘除法,稍复杂,(挖坑)续更.. ====================分割线==================== 1 /************************************************* 2 Copyright: CheerM 3 Author: CheerM 4 Date: 2016-11-02 5 Description: 实现超长int型的加减运算.输入任意长

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

C_BigDecimal_加减运算

首先举个例子说说思路: 输入str1:1.341   str2:11.2  在C语言中存储字符串的直接是字符型数组,strlen(str)代表字符串的长度(那个小数点也要算的),则str1,str2的长度为5和4.而浮点数加减运算时遵循从右往左计算,所以首先要使得字符串格式化.找到并返回存储字符串中小数点的下标,str1,str2小数点位置下标为1和2,然后用字符串长度减去即可求出小数点后的位数差,通过循环将短的加0补齐,为1.341,11.200,最后按最长长度循环将字符从右依次赋值给自定的c

大数加减1——将两个数均前后倒置,以对齐最低位

#include <stdio.h> //将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度. void read(int num[]) { int i; char ch; for (i = 0; i<500; i++) num[i] = 0; i = 1; while ((ch = getchar()) != '\n') { num[i] = ch - '0'; i++; num[0]++; } } //将数据num[]中的数翻转,以便计算 void rev

常见的编程问题(一)少大数加减

存储区的概念 常见的存储区域可分为: 栈 由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收. 由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

Leetcode 592.分数加减运算

分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1.所以在上述例子中, 2 应该被转换为 2/1. 示例 1: 输入:"-1/2+1/2" 输出: "0/1"  示例 2: 输入:"-1/2+1/2+1/3" 输出: "1/3" 示例 3: 输入:"1/3-1/

[Swift]LeetCode592. 分数加减运算 | Fraction Addition and Subtraction

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change

大数加减乘模板

大数加法: 1 #include <stdio.h> 2 3 #include <string.h> 4 5 #define M 100 //定义了数量M是100作为数组初始化的数量 6 7 8 9 int main() 10 11 { 12 13 int i, j, len_s1, len_s2; // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度, 14 15 char s1[M], s2[M]; 16 17 int num1[M] = {0}; //