PloadyFree

Длинка на Java

Feb 25th, 2017
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.42 KB | None | 0 0
  1. package net.egork;
  2.  
  3. import net.egork.collections.Pair;
  4. import net.egork.utils.io.InputReader;
  5. import net.egork.utils.io.OutputWriter;
  6.  
  7. import java.util.Arrays;
  8. import java.util.Random;
  9.  
  10. public class Task5E {
  11.     public void solve(int testNumber, InputReader in, OutputWriter out) {
  12.         if (false) {
  13.             fromBaseTest();
  14.             toBaseTest();
  15.             BigInt.divideTest();
  16.             BigInt.toStringTest();
  17.             BigInt.multiplyTest();
  18.             BigInt.addTest();
  19.         }
  20.  
  21.         int base1 = in.readInt();
  22.         int base2 = in.readInt();
  23.         String value = in.next();
  24.         BigInt bigInt = fromBase(value, base1);
  25.         out.print(toBase(bigInt, base2));
  26.     }
  27.  
  28.     private String toBase(BigInt value, int base) {
  29.         StringBuilder result = new StringBuilder();
  30.         while (!value.isZero()) {
  31.             Pair<BigInt, Integer> divide = value.divide(base);
  32.             result.append(toChar(divide.second));
  33.             value = divide.first;
  34.         }
  35.         if (result.length() == 0) result.append(0);
  36.         return result.reverse().toString();
  37.     }
  38.     public void toBaseTest() {
  39.         Random rnd = new Random(System.currentTimeMillis());
  40.         for (int i = 0; i < 1000; i++) {
  41.             int base = rnd.nextInt(35) + 2;
  42.             int number = rnd.nextInt((int) 1e9);
  43.             if (!toBase(new BigInt(number), base).equalsIgnoreCase(Integer.toString(number, base)))
  44.                 throw new OutOfMemoryError("Oops");
  45.         }
  46.     }
  47.  
  48.     private char toChar(int value) {
  49.         if (value < 10) return (char) (value + '0');
  50.         return (char) (value - 10 + 'A');
  51.     }
  52.     private int fromChar(char c) {
  53.         if (Character.isLetter(c)) return c - 'A' + 10;
  54.         return c - '0';
  55.     }
  56.  
  57.     private BigInt fromBase(String s, int base) {
  58.         BigInt result = new BigInt(0);
  59.         BigInt baseMultiplier = new BigInt(1);
  60.         for (int i = s.length() - 1; i >= 0; i--) {
  61.             int d = fromChar(s.charAt(i));
  62.             result = result.add(baseMultiplier.multiply(d));
  63.             baseMultiplier = baseMultiplier.multiply(base);
  64.         }
  65.         return result;
  66.     }
  67.     public void fromBaseTest() {
  68.         Random rnd = new Random(System.currentTimeMillis());
  69.         for (int i = 0; i < 1000; i++) {
  70.             int base = rnd.nextInt(35) + 2;
  71.             int number = rnd.nextInt((int) 1e9);
  72.             String inNewBase = Integer.toString(number, base).toUpperCase();
  73.             if (!fromBase(inNewBase, base).toString().equals(number + ""))
  74.                 throw new OutOfMemoryError("Oops");
  75.         }
  76.     }
  77. }
  78.  
  79. class BigInt {
  80.     private int[] number;
  81.  
  82.     public BigInt(int[] number) {
  83.         this.number = prepare(number);
  84.     }
  85.  
  86.     public BigInt(int value) {
  87.         int len = numLen(value);
  88.         number = new int[len];
  89.         for (int i = 0; i < len; i++) {
  90.             number[i] = value % 10;
  91.             value /= 10;
  92.         }
  93.     }
  94.  
  95.     public BigInt add(BigInt value) {
  96.         int[] result = new int[Math.max(number.length, value.number.length) + 1];
  97.         for (int i = 0, carry = 0; i < result.length; i++) {
  98.             if (i < number.length) carry += number[i];
  99.             if (i < value.number.length) carry += value.number[i];
  100.             result[i] = carry % 10;
  101.             carry /= 10;
  102.         }
  103.         return new BigInt(result);
  104.     }
  105.     public static void addTest() {
  106.         for (int i = 0; i <= 1000; i++)
  107.             for (int j = 0; j <= 1000; j++)
  108.                 if (!new BigInt(i).add(new BigInt(j)).toString().equals(i + j + ""))
  109.                     throw new OutOfMemoryError("Oops");
  110.     }
  111.  
  112.     public Pair<BigInt, Integer> divide(int value) {
  113.         int[] result = new int[number.length];
  114.         int last = number.length - 1;
  115.         int num = number[last];
  116.         while (last > 0 && num < value)
  117.             num = num * 10 + number[--last];
  118.         last++;
  119.         num /= 10;
  120.         int newLen = 0;
  121.         while (last > 0) {
  122.             newLen++;
  123.             num = num * 10 + number[--last];
  124.             result[result.length - newLen] = num / value;
  125.             num %= value;
  126.         }
  127.         return Pair.makePair(new BigInt(Arrays.copyOfRange(result, result.length - newLen, result.length)), num);
  128.     }
  129.     public static void divideTest() {
  130.         for (int i = 0; i <= 1_000; i++)
  131.             for (int j = 1; j <= 10_000; j++)
  132.                 if (!new BigInt(i).divide(j).equals(Pair.makePair(new BigInt(i / j), i % j)))
  133.                     throw new OutOfMemoryError("Oops");
  134.     }
  135.  
  136.     public BigInt multiply(int val) {
  137.         int[] result = new int[number.length + numLen(val)];
  138.         for (int i = 0; val > 0; val /= 10, i++) {
  139.             int digit = val % 10;
  140.             int carry = 0;
  141.             for (int j = 0; j < number.length; j++) {
  142.                 carry += result[i + j] + number[j] * digit;
  143.                 result[i + j] = carry % 10;
  144.                 carry /= 10;
  145.             }
  146.             result[i + number.length] += carry;
  147.         }
  148.         return new BigInt(prepare(result));
  149.     }
  150.     public static void multiplyTest() {
  151.         for (int i = 0; i <= 1_000; i++)
  152.             for (int j = 0; j <= 10_000; j++)
  153.                 if (!new BigInt(i).multiply(j).toString().equals(i * j + ""))
  154.                     throw new OutOfMemoryError("Oops");
  155.     }
  156.  
  157.     private static int[] prepare(int[] number) {
  158.         int last = number.length - 1;
  159.         while (last > 0 && number[last] == 0)
  160.             last--;
  161.         if (last == number.length - 1)
  162.             return number;
  163.         return Arrays.copyOfRange(number, 0, last + 1);
  164.     }
  165.  
  166.     private int numLen(int val) {
  167.         if (val == 0)
  168.             return 1;
  169.         int len = 1;
  170.         while ((val /= 10) > 0)
  171.             len++;
  172.         return len;
  173.     }
  174.  
  175.     public boolean isZero() {
  176.         return number.length == 1 && number[0] == 0;
  177.     }
  178.  
  179.     @Override
  180.     public boolean equals(Object obj) {
  181.         return Arrays.equals(number, ((BigInt) obj).number);
  182.     }
  183.  
  184.     @Override
  185.     public String toString() {
  186.         StringBuilder sb = new StringBuilder(number.length);
  187.         for (int i : number)
  188.             sb.append(i);
  189.         return sb.reverse().toString();
  190.     }
  191.     public static void toStringTest() {
  192.         for (int i = 0; i <= 100000; i++)
  193.             if (!new BigInt(i).toString().equals(i + ""))
  194.                 throw new OutOfMemoryError("Oops");
  195.     }
  196. }
Advertisement
Add Comment
Please, Sign In to add comment