大数加、减、乘法
比上次的好了很多了,可以进行正负数的加减乘法运算
不过还是有些bug(主要bug是输入时数字前面不能有0)
并且这些bug还导致了除法不能正确运算出……
View Code
1 package BigNumber; 2 3 public class BigNumber { 4 5 BigNumber() { 6 num = ""; 7 leng = 0; 8 flag = false; 9 } 10 11 BigNumber(String str) { 12 num = str.trim(); 13 if (str.charAt(0) == '-') { 14 flag = true;// - 15 num = num.substring(1); 16 } else { 17 flag = false;// + 18 if (str.charAt(0) == '+') { 19 num = num.substring(1); 20 } 21 } 22 leng = str.length(); 23 } 24 25 BigNumber(int arr[]) {// 不建议使用数组初始化 26 num = ""; 27 add(arr); 28 flag = false; 29 leng = num.length(); 30 } 31 32 /* 33 * private BigNumber(int arr[], int Flag) { num = ""; add(arr); if (Flag == 34 * 0) flag = false; else flag = true; leng = arr.length; } 35 */ 36 BigNumber(int x) { 37 if (x < 0) { 38 flag = true; 39 x *= -1; 40 } else 41 flag = false; 42 int len = 0, temp = x; 43 while (temp != 0) { 44 len++; 45 temp /= 10; 46 } 47 if (x == 0) { 48 num = ""; 49 add("0"); 50 } else { 51 int[] arr = new int[len]; 52 while (len != 0) { 53 len--; 54 arr[len] = x % 10; 55 x /= 10; 56 } 57 num = ""; 58 add(arr); 59 } 60 } 61 62 public int length() { 63 leng = num.length(); 64 return leng; 65 } 66 67 public void print() { 68 if (flag == true && num.compareTo("0") != 0) 69 System.out.print("-"); 70 System.out.print(num); 71 } 72 73 public void println() { 74 print(); 75 System.out.println(""); 76 } 77 78 public void add(String str) { 79 num += str; 80 } 81 82 public void add(int Num[]) { 83 String str = ""; 84 for (int i = 0; i < Num.length; i++) { 85 str += Num[i]; 86 } 87 num += str; 88 } 89 90 public BigNumber plus(BigNumber Num) { 91 BigNumber ans = new BigNumber(); 92 93 if (flag == Num.flag) 94 ans.flag = flag; 95 else if (flag == false) { 96 Num.flag = false; 97 ans = minus(Num); 98 Num.flag = true; 99 return ans; 100 } else { 101 flag = false; 102 ans = Num.minus(this); 103 flag = true; 104 return ans; 105 } 106 107 int len1 = this.length(); 108 int len2 = Num.length(); 109 int nth = (len1 > len2) ? len1 : len2; 110 int[] temp = new int[nth]; 111 int i, d; 112 for (i = 1, d = 0; i <= len1 && i <= len2; i++) { 113 temp[nth - i] = (d + num.charAt(len1 - i) 114 + Num.num.charAt(len2 - i) - '0' - '0') % 10; 115 d = (d + num.charAt(len1 - i) + Num.num.charAt(len2 - i) - '0' - '0') / 10; 116 } 117 for (; i <= len1; i++) { 118 temp[nth - i] = (d + num.charAt(len1 - i) - '0') % 10; 119 d = (d + num.charAt(len1 - i) - '0') / 10; 120 } 121 for (; i <= len2; i++) { 122 temp[nth - i] = (d + Num.num.charAt(len2 - i) - '0') % 10; 123 d = (d + Num.num.charAt(len2 - i) - '0') / 10; 124 } 125 if (d != 0) 126 ans.num = "" + d; 127 ans.add(temp); 128 return ans; 129 } 130 131 public BigNumber plus(String str) { 132 BigNumber temp = new BigNumber(str); 133 return this.plus(temp); 134 } 135 136 public BigNumber plus(int x) { 137 BigNumber temp = new BigNumber(x); 138 return this.plus(temp); 139 } 140 141 public BigNumber plus(int arr[]) { 142 BigNumber temp = new BigNumber(arr); 143 return this.plus(temp); 144 } 145 146 public BigNumber minus(BigNumber Num) { 147 BigNumber ans = new BigNumber(); 148 String str1, str2; 149 150 if (flag != Num.flag) { 151 Num.flag = flag; 152 ans = plus(Num); 153 Num.flag = (flag == true) ? false : true; 154 return ans; 155 } 156 157 if (this.length() > Num.length()) { 158 str1 = num; 159 str2 = Num.getNum(); 160 ans.flag = flag; 161 } else if (this.length() < Num.length()) { 162 str2 = num; 163 str1 = Num.getNum(); 164 ans.flag = (flag == true) ? false : true; 165 } else if (this.num.compareTo(Num.getNum()) < 0) { 166 str2 = num; 167 str1 = Num.getNum(); 168 ans.flag = (flag == true) ? false : true; 169 } else { 170 str1 = num; 171 str2 = Num.getNum(); 172 ans.flag = flag; 173 } 174 175 int len1 = str1.length(), len2 = str2.length(); 176 int i, d; 177 int[] temp = new int[len1]; 178 for (i = 1, d = 0; i <= len2; i++) { 179 temp[len1 - i] = str1.charAt(len1 - i) - d - str2.charAt(len2 - i); 180 if (temp[len1 - i] < 0) { 181 d = 1; 182 temp[len1 - i] += 10; 183 } else { 184 d = 0; 185 } 186 } 187 for (; i <= len1; i++) { 188 temp[len1 - i] = str1.charAt(len1 - i) - d - '0'; 189 if (temp[len1 - i] < 0) { 190 d = 1; 191 temp[len1 - i] += 10; 192 } else { 193 d = 0; 194 } 195 } 196 ans.add(temp); 197 return ans; 198 } 199 200 public BigNumber minus(String str) { 201 BigNumber temp = new BigNumber(str); 202 return this.minus(temp); 203 } 204 205 public BigNumber minus(int x) { 206 BigNumber temp = new BigNumber(x); 207 return this.minus(temp); 208 } 209 210 public BigNumber minus(int arr[]) { 211 BigNumber temp = new BigNumber(arr); 212 return this.minus(temp); 213 } 214 215 public BigNumber multip(BigNumber Num) { 216 BigNumber temp = new BigNumber(); 217 int nth, d, x; 218 int[] arr = new int[leng]; 219 for (nth = 0; nth < Num.getNum().length(); nth++) { 220 x = Num.getNum().charAt(nth) - '0'; 221 d = 0; 222 for (int i = 1; i <= leng; i++) { 223 arr[leng - i] = ((num.charAt(leng - i) - '0') * x + d) % 10; 224 d = ((num.charAt(leng - i) - '0') * x + d) / 10; 225 } 226 BigNumber bb = new BigNumber(); 227 if (d != 0) { 228 bb = new BigNumber(d); 229 } 230 bb.add(arr); 231 if (temp.length() != 0) { 232 temp.add("0"); 233 } 234 temp = temp.plus(bb); 235 } 236 temp.flag = (this.flag == Num.flag) ? false : true; 237 return temp; 238 } 239 240 public BigNumber multip(String str) { 241 BigNumber temp = new BigNumber(str); 242 return this.multip(temp); 243 } 244 245 public BigNumber multip(int x) { 246 BigNumber temp = new BigNumber(x); 247 return this.multip(temp); 248 } 249 250 public BigNumber multip(int arr[]) { 251 BigNumber temp = new BigNumber(arr); 252 return this.multip(temp); 253 } 254 255 public String getNum() { 256 return num; 257 } 258 259 private String num; 260 public boolean flag; 261 private int leng; 262 }
posted @ 2012-04-15 23:15 laymond 阅读(7) 评论(0) 编辑

