[关闭]
@xmruibi 2015-02-13T03:39:44.000000Z 字数 3003 阅读 784

Big Number Operation

Algorithm


This is the conclusion for big number(the number cannot be presented by Integer) operations. Doesn't contains negetive or float number cases.

1. 加法运算:

  1. private static String addOperation(String num1, String num2) {
  2. StringBuilder result = new StringBuilder();
  3. int carry = 0;
  4. int len1 = num1.length() - 1;
  5. int len2 = num2.length() - 1;
  6. while (len1 >= 0 || len2 >= 0 || carry > 0) {
  7. int localRes;
  8. if (len1 >= 0 && len2 >= 0)
  9. localRes = Character.getNumericValue(num1.charAt(len1))
  10. + Character.getNumericValue(num2.charAt(len2)) + carry;
  11. else if (len1 >= 0)
  12. localRes = Character.getNumericValue(num1.charAt(len1)) + carry;
  13. else
  14. localRes = carry;
  15. carry = localRes / 10;
  16. localRes = localRes % 10;
  17. result.insert(0, String.valueOf(localRes));
  18. len1--;
  19. len2--;
  20. }
  21. return result.toString();
  22. }

2. 减法运算:

保持被减数大于减数,需要checkBigger方法辅助比较,并做好符号标记。

  1. private static String subsOperation(String num1, String num2) {
  2. String neg="";
  3. if (checkBigger(num1, num2) > 0) {
  4. String tmp = num1;
  5. num1 = num2;
  6. num2 = tmp;
  7. neg="-";
  8. }
  9. StringBuilder result = new StringBuilder();
  10. int carry = 0;
  11. int len1 = num1.length() - 1;
  12. int len2 = num2.length() - 1;
  13. while (len1 >= 0 || len2 >= 0 || carry > 0) {
  14. int localRes;
  15. if (len1 >= 0 && len2 >= 0)
  16. localRes = Character.getNumericValue(num1.charAt(len1))
  17. - Character.getNumericValue(num2.charAt(len2)) - carry;
  18. else
  19. localRes = Character.getNumericValue(num1.charAt(len1)) - carry;
  20. if (localRes < 0) {
  21. localRes = localRes + 10;
  22. carry = 1;
  23. } else
  24. carry = 0;
  25. result.insert(0, String.valueOf(localRes));
  26. len1--;
  27. len2--;
  28. }
  29. String res = result.toString();
  30. while (res.charAt(0) == '0')
  31. res = res.substring(1);
  32. return neg+res;
  33. }
  34. private static int checkBigger(String num1, String num2) {
  35. int len1 = num1.length() - 1;
  36. int len2 = num2.length() - 1;
  37. if (len1 > len2)
  38. return -1;
  39. else if (len1 < len2)
  40. return 1;
  41. else {
  42. for (int i = 0; i < len1; i++) {
  43. if (Character.getNumericValue(num1.charAt(i)) == Character
  44. .getNumericValue(num2.charAt(i)))
  45. continue;
  46. else
  47. return Character.getNumericValue(num1.charAt(i)) < Character
  48. .getNumericValue(num2.charAt(i)) ? 1 : -1;
  49. }
  50. }
  51. return 0;
  52. }

3. 乘法运算:

模拟竖式运算,先用数组记录俩个digit的乘积,mark竖式里的递进位置,通过数组标记位置实现累加,得出整个数组后,最后再考虑进位问题。

  1. private static String mulOperation(String num1, String num2) {
  2. int len1 = num1.length() - 1;
  3. int len2 = num2.length() - 1;
  4. int[] res = new int[len1 + len2 + 2];
  5. int mark = 0;
  6. for (int i = len1; i >= 0; i--) {
  7. for (int j = len2; j >= 0; j--) {
  8. res[len2 - j + mark] += Character.getNumericValue(num1
  9. .charAt(i)) * Character.getNumericValue(num2.charAt(j));
  10. }
  11. mark++;
  12. }
  13. StringBuilder result = new StringBuilder();
  14. int carry = 0;
  15. for (int i = 0; i < res.length; i++) {
  16. int localRes = res[i] + carry;
  17. carry = localRes / 10;
  18. localRes = localRes % 10;
  19. result.insert(0, String.valueOf(localRes));
  20. }
  21. String product = result.toString();
  22. while (product.charAt(0) == '0')
  23. product = product.substring(1);
  24. return product;
  25. }

4. 除法运算并求模

同样是通过数组标记,但需要用减法来辅助,并且需要除数移位补零操作。

  1. private static String divOperation(String num1, String num2) {
  2. int mark = 1;
  3. String newnum2 = new String(num2);
  4. while (checkBigger(num1, newnum2 + "0") < 0) {
  5. newnum2 += "0";
  6. mark++;
  7. }
  8. int[] res = new int[mark];
  9. while (checkBigger(num1, num2) <= 0) {
  10. num1 = subsOperation(num1, newnum2);
  11. res[mark - 1]++;
  12. while (checkBigger(num1, newnum2) > 0) {
  13. newnum2 = newnum2.substring(0, newnum2.length() - 1);
  14. mark--;
  15. }
  16. }
  17. System.out.println("Mod: " + num1);
  18. StringBuilder result = new StringBuilder();
  19. for (int i = 0; i < res.length; i++) {
  20. result.insert(0, res[i]);
  21. }
  22. return result.toString();
  23. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注