大数加减运算

  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*)malloc(len1*sizeof(char));
 14         value = new char[len1*sizeof(char)+1];
 15     }
 16     else if (len1 <= len2)
 17     {
 18         //value = (char*)malloc(len2*sizeof(char));
 19         value = new char[len2*sizeof(char)+1];
 20     }
 21     int flag = 0;
 22
 23     int i = 0;
 24     while (len1 > 0 && len2 > 0)
 25     {
 26         if (len1 <= 0 && len2 > 0)
 27         {
 28             len1 = 1;
 29             str1[0] = ‘0‘;
 30         }
 31         else if (len1 > 0 && len2 <= 0)
 32         {
 33             len2 = 1;
 34             str2[0] = ‘0‘;
 35         }
 36         int temp;
 37         temp = (int)(str1[len1 - 1] - ‘0‘) + (int)(str2[len2 - 1] - ‘0‘);
 38         value[i++] = (char)(temp % 10 + flag + (int)‘0‘);
 39         if (temp / 10 == 1)
 40         {
 41             flag = 1;
 42         }
 43         else
 44         {
 45             flag = 0;
 46         }
 47         len1--;
 48         len2--;
 49     }
 50     if (flag == 1)
 51     {
 52         value[i++] = ‘1‘;
 53         value[i] = ‘\0‘;
 54     }
 55     else
 56     {
 57         value[i] = ‘\0‘;
 58     }
 59     i--;
 60     for(; i >= 0; i--)
 61     {
 62         cout << value[i];
 63     }
 64 }
 65 void BDminus(string str1, string str2)
 66 {
 67     int len1, len2;
 68     len1 = str1.length();
 69     len2 = str2.length();
 70     int flag = 0, i = 0;
 71     int Case = 0;
 72     char *value = NULL;
 73
 74     /*因为 string类重载了与string相比较的所有函数,包括<,>,==,>=,<=,!=*/
 75
 76     //if (len1 == len2)//两字符串长度相等
 77     //{
 78     //    int j = 0;
 79     //    while ((j < len1) && (str1[j] == str2[j]))
 80     //    {
 81     //        j++;
 82     //    }
 83     //    if (j >= len1)//字符串1等于字符串2
 84     //    {
 85     //        Case = 1;
 86     //    }
 87     //    else        //字符串1不等于字符串2
 88     //    {
 89     //        if (str1[j]>str2[j])//字符串1大于字符串2
 90     //        {
 91     //            Case = 1;
 92     //        }
 93     //        else                //字符串1小于字符串2
 94     //        {
 95     //            Case = 2;
 96     //        }
 97     //    }
 98
 99     //}
100     //else if (len1 > len2)//字符串1长度大于字符串2
101     //{
102     //    Case = 1;
103     //}
104     //else                //字符串1长度小于字符串2
105     //{
106     //    Case = 2;
107     //}
108
109     if(str1>=str2)// (Case==1)//情况一 大减小
110     {
111         value = (char *)malloc(len1*sizeof(char));
112         int temp;
113         while (len1 > 0 && len2 > 0)
114         {
115             if (flag == 1)//借位处理
116             {
117                 if (str1[len1 - 1] == ‘0‘)
118                 {
119                     str1[len1 - 1] = ‘9‘;
120                     flag = 1;
121                 }
122                 else if (str1[len1 - 1] != ‘0‘)
123                 {
124                     str1[len1 - 1] = str1[len1 - 1] - 1;
125                     flag = 0;
126                 }
127             }
128             if (str1[len1 - 1] >= str2[len2 - 1])
129             {
130                 temp = (str1[len1 - 1] - ‘0‘) - (str2[len2 - 1] - ‘0‘);
131                 flag = 0;
132             }
133             else
134             {
135                 temp = (str1[len1 - 1] - ‘0‘) + 10 - (str2[len2 - 1] - ‘0‘);
136                 flag = 1;
137             }
138             value[i++] = (char)(temp+(int)‘0‘);
139             len1--;
140             len2--;
141             if (len1 > 0 && len2 <= 0)
142             {
143                 len2 = 1;
144                 str2[0] = ‘0‘;
145             }
146         }
147     }
148     else if (str1<str2)//(Case==2)//情况二 小减大
149     {
150         value = (char *)malloc(len2*sizeof(char));
151         int temp;
152         while (len1 > 0 && len2 > 0)
153         {
154             if (flag == 1)//借位处理
155             {
156                 if (str2[len2 - 1] == ‘0‘)
157                 {
158                     str2[len2 - 1] = ‘9‘;
159                     flag = 1;
160                 }
161                 else if (str2[len2 - 1] != ‘0‘)
162                 {
163                     str2[len2 - 1] = str2[len2 - 1] - 1;
164                     flag = 0;
165                 }
166             }
167             if (str2[len2 - 1] >= str1[len1 - 1])
168             {
169                 temp = str2[len2 - 1] -str1[len1 - 1];
170                 flag = 0;
171             }
172             else
173             {
174                 temp = str2[len2 - 1] + 10 - str1[len1 - 1];
175                 flag = 1;
176             }
177             value[i++] = (char)(temp + (int)‘0‘);
178             len1--;
179             len2--;
180             if (len1 <= 0 && len2 > 0)
181             {
182                 len1 = 1;
183                 str1[0] = ‘0‘;
184             }
185         }
186         cout << "-";
187     }
188
189     value[i] = ‘\0‘;
190     i--;
191     while (i >= 0 && value[i] == ‘0‘)
192     {
193         i--;
194     }
195     if (i < 0)
196     {
197         cout << 0;
198     }
199     else
200     {
201         for(; i >= 0; i--)
202         {
203             cout << value[i];
204         }
205     }
206 }
207 int main(void)
208 {
209     string str1,str2,result;
210     cin >> str1>>str2;
211     BDplus(str1, str2);
212     BDminus(str1, str2);
213
214     return 0;
215 }
时间: 2024-08-26 11:33:44

大数加减运算的相关文章

字符串大数加减运算问题

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

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

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

【算法】大数加减

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

大数加减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来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

大数加减乘模板

大数加法: 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}; //

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

linux date 加减运算

在linux shell编程中,经常用到日期的加减运算 查看时间: [[email protected] ~]# date Fri Sep  2 13:12:56 CST 2016 修改时间: [[email protected] ~]# date -s "1980-01-01 00:00:00" Tue Jan  1 00:00:00 CST 1980 其实date命令本身提供了日期的加减运算 非常方便.例如:得到昨天的时间date +%Y%m%d --date="-1 d

让文本框支持加减运算的实现方法

一个网页表单效果,让表单内的文本框支持加减运算,不过你要按正确的运算式输入,要不然它没有那么智能哦,比如输入1+5,文本框旁边会显示计算结果,这要归功于JavaScript的功能. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&