Advertisement
Guest User

Untitled

a guest
May 24th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.89 KB | None | 0 0
  1. package simple;
  2.  
  3. import java.math.BigInteger;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.List;
  7. import java.util.Stack;
  8.  
  9. public class MyBig {
  10.  
  11.     private ArrayList<Integer> data = new ArrayList<>();
  12.    
  13.     public MyBig(String str) {
  14.         for(int i = 0; i < str.length(); i++){
  15.             int c = (int)str.charAt(i) - 48;
  16.             data.add(c);
  17.         }
  18.     }
  19.  
  20.     public MyBig(){
  21.         data.add(0);
  22.     }
  23.  
  24.     private MyBig(ArrayList<Integer> data){
  25.         this.data = (ArrayList<Integer>) data.clone();
  26.     }
  27.  
  28.     public void print() {
  29.         StringBuilder result = new StringBuilder();
  30.         for (int i = 0; i < data.size(); i++) {
  31.             result.append(data.get(i));
  32.         }
  33.         System.out.println(result.toString());
  34.     }
  35.  
  36.     public int getNum(int index){
  37.        if(index < 0 || index >= data.size())
  38.            throw new Error();
  39.  
  40.        return data.get(index);
  41.     }
  42.  
  43.     public void normalize(){
  44.         while(data.size() > 1 && data.get(0) == 0){
  45.             data.remove(0);
  46.         }
  47.     }
  48.  
  49.     public void add(MyBig second){
  50.         MyBig a = this.clone();
  51.         MyBig b = second.clone();
  52.  
  53.         if(MyBig.compare(a, b) == -1){
  54.             MyBig tmp = a;
  55.             a = b;
  56.             b = tmp;
  57.         }
  58.  
  59.         Stack<Integer> stack = new Stack<>();
  60.  
  61.         int ost = 0;
  62.  
  63.         for(int i = a.size() - 1; i >= a.size() - b.size(); i--){
  64.             int res = (a.getNum(i) + b.getNum(i - a.size() + b.size()) + ost) % 10;
  65.             ost = a.getNum(i) + b.getNum(i - a.size() + b.size()) + ost >= 10 ? 1 : 0;
  66.             stack.add(res);
  67.         }
  68.  
  69.  
  70.         for(int i = a.size() - b.size() - 1; i >= 0; i--){
  71.             int res = (a.getNum(i) + ost) % 10;
  72.             ost = a.getNum(i) + ost >= 10 ? 1 : 0;
  73.             stack.add(res);
  74.         }
  75.  
  76.         if(ost > 0) stack.add(1);
  77.  
  78.         ArrayList<Integer> result = new ArrayList<>();
  79.         while(!stack.isEmpty())
  80.             result.add(stack.pop());
  81.  
  82.         data = result;
  83.     }
  84.  
  85.     public static MyBig add(MyBig first, MyBig second) {
  86.         MyBig a = first.clone();
  87.         MyBig b = second.clone();
  88.         a.add(b);
  89.         return a;
  90.     }
  91.  
  92.     public void subtract(MyBig second) {
  93.         MyBig a = this.clone();
  94.         MyBig b = second.clone();
  95.  
  96.         if (MyBig.compare(a, b) == -1) {
  97.             throw new Error();
  98.         }
  99.  
  100.         Stack<Integer> stack = new Stack<>();
  101.  
  102.         boolean flag = false;
  103.  
  104.         for (int i = a.size() - 1; i >= a.size() - b.size(); i--) {
  105.             int res = a.getNum(i) - b.getNum(i - a.size() + b.size());
  106.             if (flag) {
  107.                 if (res > 0) {
  108.                     flag = false;
  109.                     res--;
  110.                 } else {
  111.                     res += 9;
  112.                 }
  113.             } else {
  114.                 if (res < 0) {
  115.                     flag = true;
  116.                     res += 10;
  117.                 }
  118.             }
  119.             stack.add(res);
  120.         }
  121.  
  122.         for (int i = a.size() - b.size() - 1; i >= 0; i--) {
  123.             int res = a.getNum(i);
  124.             if (flag) {
  125.                 if (res > 0) {
  126.                     flag = false;
  127.                     res--;
  128.                 } else {
  129.                     res += 9;
  130.                 }
  131.             } else {
  132.                 if (res < 0) {
  133.                     flag = true;
  134.                     res += 10;
  135.                 }
  136.             }
  137.             stack.add(res);
  138.         }
  139.  
  140.         ArrayList<Integer> nums = new ArrayList<>();
  141.         while(!stack.isEmpty())
  142.             nums.add(stack.pop());
  143.  
  144.         data = nums;
  145.         this.normalize();
  146.     }
  147.  
  148.     public static MyBig subtract(MyBig first, MyBig second) {
  149.         MyBig a = first.clone();
  150.         MyBig b = second.clone();
  151.         a.subtract(b);
  152.         return a;
  153.     }
  154.  
  155.     public int size(){
  156.         return data.size();
  157.     }
  158.  
  159.     public void multiply(MyBig second){
  160.         MyBig a = this.clone();
  161.         MyBig b = second.clone();
  162.         if(b.isZero()) {
  163.             data.clear();
  164.             data.add(0);
  165.             return;
  166.         }
  167.  
  168.         for(int i = 0; i < b.toInt() - 1; i++){
  169.             this.add(a);
  170.         }
  171.     }
  172.  
  173.     public static MyBig multiply(MyBig first, MyBig second) {
  174.         MyBig a = first.clone();
  175.         MyBig b = second.clone();
  176.         a.multiply(b);
  177.         return a;
  178.     }
  179.  
  180.     public int compare(MyBig a) {
  181.         if (this.size() > a.size()) {
  182.             return 1;
  183.         }
  184.         if (this.size() < a.size()) {
  185.             return -1;
  186.         }
  187.  
  188.         for (int i = 0; i < this.size(); i++) {
  189.             if(this.getNum(i) > a.getNum(i)){
  190.                 return 1;
  191.             }
  192.             if (this.size() < a.size()) {
  193.                 return -1;
  194.             }
  195.         }
  196.         return 0;
  197.     }
  198.  
  199.     public static int compare(MyBig a, MyBig b) {
  200.         // 1 a > b, -1 b > a, 0 a = b
  201.         if (a.size() > b.size()) {
  202.             return 1;
  203.         }
  204.         if (a.size() < b.size()) {
  205.             return -1;
  206.         }
  207.  
  208.         for (int i = 0; i < a.size(); i++) {
  209.             if(a.getNum(i) > b.getNum(i)){
  210.                 return 1;
  211.             }
  212.             if (a.size() < b.size()) {
  213.                 return -1;
  214.             }
  215.         }
  216.         return 0;
  217.     }
  218.  
  219.     public int toInt(){
  220.         int res = 0;
  221.         int d = 1;
  222.         for(int i = size() - 1; i >= 0; i--){
  223.             res += data.get(i) * d;
  224.             d *= 10;
  225.         }
  226.         return res;
  227.     }
  228.  
  229.     public boolean isZero(){
  230.         return data.size() == 1 && data.get(0) == 0;
  231.     }
  232.  
  233.     public MyBig clone(){
  234.         return new MyBig(data);
  235.     }
  236.  
  237.     @Override
  238.     public String toString() {
  239.         StringBuilder builder = new StringBuilder();
  240.  
  241.         for(Integer a : data){
  242.             builder.append(a);
  243.         }
  244.         return builder.toString();
  245.     }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement