Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.22 KB | None | 0 0
  1. package pr1.uebung08;
  2.  
  3. import static pr.MakeItSimple.*;
  4.  
  5. public class BigIntegerImplementation implements BigInteger {
  6. private int[] numbers;
  7.  
  8. public BigIntegerImplementation() {
  9.  
  10. }
  11.  
  12. public BigIntegerImplementation(String zahl) {
  13.  
  14. // Prüfung ob String nur aus numbers besteht
  15. for (int i = 0; i < zahl.length(); i++) {
  16. if (zahl.charAt(i) >= '0' && zahl.charAt(i) <= '9') {
  17.  
  18. } else
  19. throw new PRException("Ungültiger String");
  20.  
  21. }
  22. // zähle die führenden nullen und speichere die Anzahl in i
  23. int i = 0;
  24.  
  25. while (zahl.charAt(i) == '0'/*&&i<zahl.length()-1*/)
  26. i++;
  27. int[] numbers = new int[zahl.length() - i];
  28. // Speichere die einzelnen Ziffern im String ins Integer Array
  29. for (int j = 0; j < numbers.length; j++) {
  30. numbers[j] = zahl.charAt(i) - '0';
  31. if (i < zahl.length() - 1)
  32. i++;
  33.  
  34. }
  35.  
  36. this.numbers = numbers;
  37. }
  38.  
  39. public void setDigits(int[] numbers) {
  40. this.numbers = numbers;
  41.  
  42. }
  43.  
  44. @Override
  45. public BigInteger add(BigInteger number) {
  46. //TODO: Wenn param>numbers
  47. // Erstelle result für die Rückgabe
  48. BigInteger result;
  49. // Objekt das result zugewiesen wird
  50. BigIntegerImplementation tmpObj = new BigIntegerImplementation();
  51.  
  52. // Speichere die numbers der Objekte in Arrays
  53. int[] params = number.getDigits();
  54. int[] numbers = this.numbers;
  55.  
  56. int length1 = numbers.length - 1;
  57. int length2 = params.length - 1;
  58.  
  59. int minLength;
  60.  
  61. int[] array3 = new int[numbers.length];
  62.  
  63. for (int i = 0; i < array3.length; i++) {
  64.  
  65. array3[i] = numbers[i];
  66. }
  67. /*
  68. * findet heraus welches der beiden Arrays kleiner ist damit bei der For
  69. * schleife keine Exception ausgelöst wird
  70. */
  71. if (length1 < length2)
  72. minLength = length1;
  73. else
  74. minLength = length2;
  75.  
  76. /*
  77. * arrays werden von höchsten Index zum kleinsten durchlaufen und addiert
  78. */
  79. for (; minLength >= 0; minLength--) {
  80.  
  81. array3[length1] = numbers[length1] + params[length2];
  82. length1--;
  83. length2--;
  84.  
  85. }
  86. /*
  87. * moreDigits wird angelegt falls die Summe über eine Stellenwertigkeit mehr
  88. * verfügt (wenn beim ersten Index ein Übertrag stattfindet) ----- Falls im
  89. * Index ein Übertrag stattfindet dann behalte den rest im Index und springe in
  90. * einen Index tiefer und Inkrementiere
  91. */
  92. boolean moreDigits = false;
  93. for (int i = array3.length - 1; i >= 0; i--) {
  94. if (array3[0] >= 10)
  95. moreDigits = true;
  96. if (array3[i] >= 10) {
  97. array3[i] = array3[i] % 10;
  98. if (i > 0)
  99. array3[--i] += 1;
  100. i++;
  101.  
  102. }
  103.  
  104. }
  105. /*
  106. * größeres array wird angelegt da größere Zahl in den ersten Index =0 wird 1
  107. * reingeschrieben, da zahl um eine Stellenwertigkeit wächst
  108. */
  109. if (moreDigits) {
  110. int k = 1;
  111. int[] array4 = new int[(array3.length + 1)];
  112. array4[0] = 1;
  113. for (int i = 0; i < array3.length; i++) {
  114. array4[k] = array3[i];
  115. k++;
  116.  
  117. }
  118. tmpObj.setDigits(array4);
  119. } else
  120. tmpObj.setDigits(array3);
  121.  
  122. result = tmpObj;
  123.  
  124. return result;
  125. }
  126.  
  127. @Override
  128. public BigInteger times(BigInteger number) {
  129. // TODO:arr in obj speichern
  130. int[] param = number.getDigits();
  131. int[][] result;
  132. int[]endresult;
  133. int k = 0;
  134. int range;
  135. int range2;
  136. int nullen;
  137. int x = 0;
  138.  
  139. if (!greaterThan(number)) {
  140. range = numbers.length;
  141. result = new int[range][param.length + numbers.length - 1];
  142. range = numbers.length;
  143. range2 = param.length;
  144. } else {
  145. range = param.length;
  146. result = new int[range][param.length + numbers.length - 1];
  147. range2 = numbers.length;
  148. }
  149.  
  150. for (int i = 0; i < range; i++) {
  151. nullen = i;
  152.  
  153. for (int j = 0; j < range2; j++) {
  154. // zähle die anzahl der nullen und rechne erst nach der letzen null
  155. if (nullen > 0) {
  156. nullen--;
  157. } else {
  158. // var k ist dazu da damit die rechnung immer erst nach der letzen null gemacht
  159. // wird indem k++ (wenn j++ dann overflow)
  160. k = j;
  161. // var x ist dazu da, das param den richtigen index bekommt da j auch
  162. // hochgezählt wird wenn nicht gerechnet wird
  163. // die anzahl der nullen i wird von j abgezogen
  164. x = j - i;
  165.  
  166. // while schleife ist dazu da, dass jede zahl in param durchgegangen wird , da
  167. // die schleife sonst vorzeitig abbricht wegen nullzähler
  168. while (x < range2) {
  169. if (!greaterThan(number)) {
  170. result[i][k++] = numbers[i] * param[x];
  171. } else {
  172. result[i][k++] = numbers[x] * param[i];
  173. }
  174. x++;
  175. }
  176. }
  177.  
  178. }
  179.  
  180. }
  181.  
  182.  
  183. int v = result.length - 1;
  184. int overflow;
  185. for (int j = result[v].length - 1; j > 0; j--) {
  186. for (int i = result.length - 1; i > 0; i--) {
  187. result[0][j] += result[i][j];
  188. if (result[0][j] >= 10) {
  189. overflow = result[0][j] / 10;
  190. result[0][j] %= 10;
  191. result[0][--j] += overflow;
  192. j++;
  193. }
  194.  
  195. }
  196. }
  197.  
  198. if(result[0][0]>=10) {
  199. endresult= new int[param.length + numbers.length];
  200. endresult[0]=result[0][0]%10;
  201. endresult[1]=result[0][0]/10;
  202. int j=1;
  203. for(int i=2; i< endresult.length;i++) {
  204. endresult[i]= result[0][j];
  205. j++;
  206. }
  207. }else {
  208. endresult= new int[param.length + numbers.length - 1];
  209. for(int i=0; i<endresult.length;i++) {
  210. endresult[i]=result[0][i];
  211. }
  212. }
  213.  
  214.  
  215.  
  216. for (int i = 0; i < endresult.length; i++) {
  217. print(endresult[i]);
  218. }
  219.  
  220. return null;
  221. }
  222.  
  223. @Override
  224. public int length() {
  225. int i;
  226. for (i = 0; i < numbers.length; i++)
  227. ;
  228. return i;
  229. }
  230.  
  231. @Override
  232. public int[] getDigits() {
  233.  
  234. return numbers;
  235. }
  236.  
  237. @Override
  238. public String toString() {
  239. String strNumbers = "";
  240.  
  241. for (int i = 0; i < numbers.length; i++) {
  242. strNumbers += "" + numbers[i];
  243.  
  244. }
  245. return strNumbers;
  246. }
  247.  
  248. @Override
  249. public boolean equals(BigInteger number) {
  250.  
  251. return false;
  252. }
  253.  
  254. @Override
  255. public boolean greaterThan(BigInteger number) {
  256. int[] numbers = this.numbers;
  257. int[] param = number.getDigits();
  258.  
  259. if (length() > number.length())
  260. return true;
  261. if (length() < number.length())
  262. return false;
  263. if (length() == number.length()) {
  264. for (int i = 0; i < numbers.length;) {
  265. if (numbers[i] > param[i])
  266. return true;
  267. else if (numbers[i] < param[i])
  268. return false;
  269. else
  270. i++;
  271. }
  272. }
  273. return false;
  274. }
  275.  
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement