大数加减运算
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 }