Advertisement
Guest User

Untitled

a guest
May 28th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.77 KB | None | 0 0
  1. package angel;
  2.  
  3. public class Main {
  4.  
  5. public static void main(String[] args) {
  6.  
  7.  
  8. String[] testsFirst = {"20", "20", "-10", "-20", "20", "10", "20", "-9", "-9", "-19","0"};
  9. String[] testsSecond = {"-40", "10", "120", "9", "-9", "-19", "-11", "-9", "-20", "-1","0"};
  10.  
  11.  
  12. for (int i = 0; i < testsSecond.length; i++) {
  13. String input = testsFirst[i];
  14.  
  15. String secondInput = testsSecond[i];
  16. BigIntegerImplementation b1 = new BigIntegerImplementation(testsFirst[i]);
  17. BigIntegerImplementation b2 = new BigIntegerImplementation(testsSecond[i]);
  18.  
  19.  
  20. String debug = "";
  21. System.out.print(debug);
  22.  
  23. BigIntegerImplementation sumResult = b1.add(b2);
  24. System.out.println(input + " + (" + secondInput + ") = " + sumResult.toString());
  25. System.out.println(input + " - (" + secondInput + ") = " + b1.subtract(b2));
  26.  
  27. }
  28. }
  29.  
  30. }
  31.  
  32.  
  33. ******************************************************************************************************************************
  34.  
  35. package angel;
  36.  
  37. import java.util.ArrayList;
  38. import java.util.Collections;
  39. import java.util.List;
  40.  
  41. public class BigIntegerImplementation {
  42.  
  43. private List<Integer> digitsAsList;
  44. boolean isPositive;
  45.  
  46. BigIntegerImplementation(String input) {
  47. if ("-".equals(input.substring(0, 1))) {
  48. if ("0".equalsIgnoreCase(input.substring(1, input.length()))) {
  49. this.isPositive = true;
  50. this.setmyBigInt(input.substring(1, input.length()));
  51. } else {
  52. this.isPositive = false;
  53. this.setmyBigInt(input.substring(1, input.length()));
  54. }
  55. } else {
  56. if ("+".equals(input.substring(0, 1))) {
  57. this.isPositive = true;
  58. this.setmyBigInt(input.substring(1, input.length()));
  59. } else {
  60. this.isPositive = true;
  61. this.setmyBigInt(input);
  62. }
  63. }
  64. }
  65.  
  66. BigIntegerImplementation subtract(BigIntegerImplementation second) {
  67. List<Integer> firstList = this.getDigitsAsList();
  68. List<Integer> secondList = second.getDigitsAsList();
  69. boolean isFirstPositive = this.isPositive;
  70. boolean isSecondPositive = second.isPositive;
  71.  
  72. if (isFirstPositive && isSecondPositive) {
  73. if (comapreTwoNumbers(firstList, secondList) == 1) {
  74. return new BigIntegerImplementation(subtract(firstList, secondList));
  75. } else {
  76. return new BigIntegerImplementation("-" + subtract(secondList, firstList));
  77. }
  78. }
  79. if (!isFirstPositive && !isSecondPositive) {
  80. if (comapreTwoNumbers(firstList, secondList) == 1) {
  81. // -20 ; -10
  82. // -20 - (-10) => - (20 - 10);
  83. return new BigIntegerImplementation("-" + subtract(firstList, secondList));
  84. } else {
  85. // -10 ; -50 => - 10 - (-50) => -10 + 50 => 50 - 10;
  86. return new BigIntegerImplementation(subtract(secondList, firstList));
  87. }
  88. }
  89. if (isFirstPositive && !isSecondPositive) {
  90. if (comapreTwoNumbers(firstList, secondList) == 1) {
  91. // 30 - (-10); => 30 + 10;
  92. return new BigIntegerImplementation(privateSum(firstList, secondList));
  93. } else {
  94. // 30 - (-50) => 30 + 50;
  95. return new BigIntegerImplementation(privateSum(secondList, firstList));
  96. }
  97. }
  98.  
  99. if (!isFirstPositive && isSecondPositive) {
  100. if (comapreTwoNumbers(firstList, secondList) == 1) {
  101. // -50 - (20); =>-50 -20 => - (50 + 20);
  102. return new BigIntegerImplementation("-" + privateSum(firstList, secondList));
  103. } else {
  104. // - 50 - (150) => - (50 + 150) => - (150 + 50);
  105. return new BigIntegerImplementation("-" + privateSum(secondList, firstList));
  106. }
  107. }
  108.  
  109. System.out.println("Imame greshka, vhodnite danni sa parviq int: " + this.toString());
  110. System.out.println("Imame greshka, vhodnite danni sa vtoriq int: " + second.toString());
  111. return null;
  112. }
  113.  
  114. BigIntegerImplementation add(BigIntegerImplementation second) {
  115. List<Integer> firstList = this.getDigitsAsList();
  116. List<Integer> secondList = second.getDigitsAsList();
  117. boolean isFirstPositive = this.isPositive;
  118. boolean isSecondPositive = second.isPositive;
  119.  
  120. if (isFirstPositive && isSecondPositive) {
  121. String result = "";
  122. if (comapreTwoNumbers(firstList, secondList) == -1) {
  123. result = privateSum(secondList, firstList);
  124. } else {
  125. result = privateSum(firstList, secondList);
  126. }
  127. return new BigIntegerImplementation(result);
  128. }
  129. if (!isFirstPositive && !isSecondPositive) {
  130. String result = "";
  131. if (comapreTwoNumbers(firstList, secondList) == -1) {
  132. result = privateSum(secondList, firstList);
  133. } else {
  134. result = privateSum(firstList, secondList);
  135. }
  136. return new BigIntegerImplementation("-" + result);
  137. }
  138.  
  139. if (isFirstPositive && !isSecondPositive) {
  140. if (comapreTwoNumbers(firstList, secondList) == 1) {
  141. return new BigIntegerImplementation(subtract(firstList, secondList));
  142. } else {
  143. return new BigIntegerImplementation("-" + subtract(secondList, firstList));
  144. }
  145. }
  146.  
  147. if (!isFirstPositive && isSecondPositive) {
  148. if (comapreTwoNumbers(firstList, secondList) == -1) {
  149. return new BigIntegerImplementation(subtract(secondList, firstList));
  150. } else {
  151. return new BigIntegerImplementation("-" + subtract(firstList, secondList));
  152. }
  153. }
  154. System.out.println("Imame greshka, vhodnite danni sa parviq int: " + this.toString());
  155. System.out.println("Imame greshka, vhodnite danni sa vtoriq int: " + second.toString());
  156. return null;
  157. }
  158.  
  159. private static String subtract(List<Integer> firstNumber, List<Integer> secondNumber) {
  160. StringBuilder sb = new StringBuilder();
  161. int result = 0;
  162. int toRemember = 0;
  163. int first;
  164. int second = 0;
  165.  
  166. for (int i = 0; i < firstNumber.size(); i++) {
  167. if (i >= secondNumber.size()) {
  168. first = firstNumber.get(firstNumber.size() - 1 - i);
  169. } else {
  170. second = secondNumber.get(secondNumber.size() - 1 - i);
  171. first = firstNumber.get(firstNumber.size() - 1 - i);
  172. }
  173. if (first - toRemember - second >= 0) {
  174. result = first - toRemember - second;
  175. toRemember = 0;
  176. } else {
  177. result = first + 10 - toRemember - second;
  178. toRemember = 1;
  179. }
  180. sb.append(String.valueOf(result));
  181. second = 0;
  182. }
  183. sb.reverse();
  184. // Here we remove the zeroes from the beginning in the result
  185. while (sb.charAt(0) == '0' && sb.length() > 1) {
  186. sb.deleteCharAt(0);
  187. }
  188. if (sb.length() == 0) {
  189. sb.append("0");
  190. }
  191. return sb.toString();
  192. }
  193.  
  194. private String privateSum(List<Integer> firstNumber, List<Integer> secondNumber) {
  195. if (comapreTwoNumbers(firstNumber, secondNumber) == -1) {
  196. List<Integer> temp = new ArrayList<>();
  197. temp = secondNumber;
  198. secondNumber = firstNumber;
  199. firstNumber = temp;
  200. }
  201. int toAdd = 0;
  202. StringBuilder sb = new StringBuilder();
  203. Integer difference = firstNumber.size() - secondNumber.size();
  204. for (int i = secondNumber.size() - 1; i >= 0; i--) {
  205. Integer firstEdinica = firstNumber.get(i + difference);
  206. Integer secondEdinica = secondNumber.get(i);
  207. int result = firstEdinica + secondEdinica + toAdd;
  208. sb.append(result % 10);
  209. toAdd = result / 10;
  210. }
  211. for (int i = difference - 1; i >= 0; i--) {
  212. Integer firstEdinica = firstNumber.get(i);
  213. int result = firstEdinica + toAdd;
  214. sb.append(result % 10);
  215. toAdd = result / 10;
  216. }
  217. if (toAdd == 1) {
  218. sb.append(toAdd);
  219. }
  220. return sb.reverse().toString();
  221. }
  222.  
  223. private void setmyBigInt(String input) {
  224. List<Integer> inputAsList = new ArrayList<>();
  225. input = removeLeadingZeroes(input);
  226. for (int i = 0; i < input.length(); i++) {
  227. inputAsList.add(Integer.valueOf(input.substring(i, i + 1)));
  228. }
  229. this.digitsAsList = inputAsList;
  230. }
  231.  
  232. private List<Integer> getDigitsAsList() {
  233. return Collections.unmodifiableList(this.digitsAsList);
  234. }
  235.  
  236. private String removeLeadingZeroes(String input) {
  237. while ("0".equalsIgnoreCase(input.substring(0, 1)) && input.length() > 1) {
  238. input = input.substring(1, input.length());
  239. }
  240. return input;
  241. }
  242.  
  243. private int comapreTwoNumbers(List<Integer> firstNumber, List<Integer> secondNumber) {
  244. if (firstNumber.size() > secondNumber.size()) {
  245. return 1;
  246. } else if (firstNumber.size() < secondNumber.size()) {
  247. return -1;
  248. } else {
  249. return compareTwoEqualyLongNumbers(firstNumber, secondNumber);
  250. }
  251. }
  252.  
  253. private int compareTwoEqualyLongNumbers(List<Integer> firstNumber, List<Integer> secondNumber) {
  254. for (int i = 0; i < firstNumber.size(); i++) {
  255. int leadingFirst = firstNumber.get(i);
  256. int leadingSecond = secondNumber.get(i);
  257. if (leadingFirst > leadingSecond) {
  258. return 1;
  259. }
  260. if (leadingFirst < leadingSecond) {
  261. return -1;
  262. }
  263. }
  264. return 1;
  265. }
  266.  
  267. @Override
  268. public String toString() {
  269. StringBuilder sb = new StringBuilder();
  270.  
  271. if (!this.isPositive) {
  272. sb.append("-");
  273. }
  274.  
  275. for (int i : this.digitsAsList) {
  276. sb.append(i);
  277. }
  278. return sb.toString();
  279. }
  280.  
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement