1. 程式人生 > >大整數加法與減法

大整數加法與減法

esp bre pre 大整數加法 對齊 style cstring 小數 nbsp

模擬運算

用數組逆向保存大數每一位 加法直接從尾向前相加(尾部已對齊) 註意進位

減法類似 確保大數減小數 不夠減了向前減一 需要註意符號的有無問題

  1 #include <iostream>
  2 #include <cstring>
  3 #include <string>
  4 using namespace std;
  5 
  6 int a[11000], b[11000];
  7 string s1, s2;
  8 
  9 void Add()
 10 {
 11     int len1 = s1.length();
 12     int
len2 = s2.length(); 13 int Max = max(len1, len2); 14 int k; 15 for (int i = len1-1, k = 0; i >= 0; i--) 16 a[k++] = s1[i] - 0; 17 for (int i = len2-1, k = 0; i >= 0; i--) 18 b[k++] = s2[i] - 0; 19 20 if (a[0] == 0 && b[0] == 0) { 21 cout <<
0; 22 return; 23 } 24 int up = 0; 25 for (int i = 0; i < Max+1; i++) { 26 a[i] = a[i] + b[i] + up; 27 up = a[i] / 10; 28 a[i] %= 10; 29 } 30 int first; 31 for (first = Max+1; first >= 0; first--) 32 if (a[first]) 33 break
; 34 35 for (int i = first; i >= 0; i--) 36 cout << a[i]; 37 38 } 39 40 void Sub(string Max, string Min) //a - b 41 { 42 int len1 = Max.length(); 43 int len2 = Min.length(); 44 int MaxLen = max(len1, len2); 45 46 int k; 47 for (int i = len1-1, k = 0; i >= 0; i--) 48 a[k++] = Max[i] - 0; 49 for (int i = len2 - 1, k = 0; i >= 0; i--) 50 b[k++] = Min[i] - 0; 51 52 int up = 0; 53 for (int i = 0; i < MaxLen+1; i++) { 54 a[i] = a[i] - b[i] - up; 55 if (a[i] < 0) { 56 up = 1; 57 a[i] += 10; 58 } 59 else 60 up = 0; 61 } 62 63 int first; 64 for (first = MaxLen+1; first >= 0; first--) 65 if (a[first]) 66 break; 67 68 if (first == -1) 69 cout << "0"; 70 else { 71 for (int i = first; i >= 0; i--) 72 cout << a[i]; 73 } 74 } 75 76 int main() 77 { 78 cin >> s1 >> s2; 79 80 memset(a, 0, sizeof(a)); 81 memset(b, 0, sizeof(b)); 82 83 if (s1[0] == - && s2[0] == -) 84 { 85 cout << -; 86 s1.erase(0, 1); 87 s2.erase(0, 1); 88 Add(); 89 } 90 else if (s1[0] == - || s2[0] == -) 91 { 92 string Max, Min; 93 if (s1[0] == -) { 94 if (s1.length()-1 > s2.length()) 95 cout << "-"; 96 if (s1.length()-1 == s2.length()) 97 { 98 if (s1[1] > s2[0]) 99 cout << "-"; 100 } 101 s1.erase(0, 1); 102 } 103 104 if (s2[0] == -) { 105 106 if (s2.length()-1 > s1.length()) 107 cout << "-"; 108 if (s1.length() == s2.length()-1) 109 { 110 if (s2[1] > s1[0]) 111 cout << "-"; 112 } 113 s2.erase(0, 1); 114 } 115 116 if(s1.length() > s2.length()) 117 { 118 Max = s1; 119 Min = s2; 120 } 121 else if (s1.length() == s2.length() && s1[0] > s2[0]) 122 { 123 Max = s1; 124 Min = s2; 125 } 126 else { 127 Min = s1; 128 Max = s2; 129 } 130 Sub(Max, Min); 131 } 132 else 133 Add(); 134 135 return 0; 136 }

大整數加法與減法