Ranking (as of 2013-06-15): 408 out of 875
Language: JAVA
// Uva 10023 - Square root /* See Methods of computing square roots - Wikipedia, the free encyclopedia. (http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Digit-by-digit_calculation) */ import java.util.Scanner; import java.math.BigInteger; class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String line = sc.nextLine(); int nr_cases = Integer.parseInt(line); while (nr_cases-- > 0) { sc.nextLine(); // skip a line line = sc.nextLine(); System.out.println(squareRoot(line.trim())); if (nr_cases > 0) System.out.println(); } } static String squareRoot(String n) { final BigInteger TWENTY = BigInteger.TEN.add(BigInteger.TEN); int i = 0; BigInteger c = BigInteger.valueOf(n.charAt(i++) - '0'); // current value if ((n.length() & 1) == 0) c = c.multiply(BigInteger.TEN).add(BigInteger.valueOf(n.charAt(i++) - '0')); BigInteger p = BigInteger.ZERO; // part of the root found so far while (true) { // determine the greatest digit x such that y = (20 * p + x) * x // does not exceed c BigInteger x = BigInteger.ZERO, y = BigInteger.ZERO; if (p.equals(BigInteger.ZERO)) { if (!c.equals(BigInteger.ZERO)) { x = BigInteger.valueOf((long)Math.sqrt(c.doubleValue())); // x = floor(sqrt(c)) y = x.multiply(x); // y = x * x } } else { BigInteger twenty_p = p.multiply(TWENTY); x = c.divide(twenty_p); // c / (20 * p) y = twenty_p.add(x).multiply(x); // (20 * p + x) * x int result = y.compareTo(c); if (result < 0) { for (x = x.add(BigInteger.ONE); ; x = x.add(BigInteger.ONE)) { y = twenty_p.add(x).multiply(x); if (y.compareTo(c) > 0) break; } x = x.subtract(BigInteger.ONE); y = twenty_p.add(x).multiply(x); } else if (result > 0) { for (x = x.subtract(BigInteger.ONE); ; x = x.subtract(BigInteger.ONE)) { y = twenty_p.add(x).multiply(x); if (y.compareTo(c) <= 0) break; } } } c = c.subtract(y); p = p.multiply(BigInteger.TEN).add(x); // System.out.println(String.format("%s %s", p, c)); if (i == n.length()) break; c = c.multiply(BigInteger.TEN).add(BigInteger.valueOf(n.charAt(i++) - '0')); c = c.multiply(BigInteger.TEN).add(BigInteger.valueOf(n.charAt(i++) - '0')); } return p.toString(); } }
No comments:
Post a Comment