título
https://vjudge.net/problem/51Nod-1166
pensamiento
Un método más rápido iteración de Newton. El problema y minimizar la raíz de x ^ 2 -n = 0 se asume para la x0 solución, es la corriente solución x y x ^ 2 - n> 0, el (x, x ^ 2 - n) a una tangente con el eje x la intersección del eje horizontal para los nuevos x, entonces la iteración puede ser más rápido que dicotomía
Newton método iterativo (método de Newton), también conocido como el método de Newton - Raphson (Raphson) (método de Newton-Raphson), se propone un método de Newton en el siglo 17 en el campo de los números reales y aproximación campo complejo para resolver la ecuación. Fórmula: (X + A / X) / 2
Este enfoque puede ser muy eficaz en la obtención de una aproximación de una raíz cuadrada: por ejemplo, cuánto me gustaría enraizamiento Nº 2 iguales. Después método iteración de Newton utilizando este valor rápidamente se aproxima a la raíz 2:
(4 + 2/4) / 2 = 2,25
(2 + 2,25 / 2,25) / 2 = 1,56944 ...
(1,56944 ... + 2 / 1,56944 ...) / 2 = 1,42189 ...
(1,42189 ... + 2 / 1,42189 ...) / 2 = 1,41423 ...
código
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;
public class Main {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String a = _07Reader.next();
BigInteger N = new BigInteger(a);
//下面的if语句不晓得干什么的,不带上会超时
//如果输入的是偶数位的数,例如16
if (N.toString().length() % 2 == 0) {
//截取这两位数
a = a.substring(0, N.toString().length()/2 + 1);
}else {
a = a.substring(0, (1+N.toString().length())/2);
}
BigInteger x = new BigInteger(a);
BigInteger two = new BigInteger("2");
//考虑输入是1的情况
if (a == "1") {
System.out.println(1);
}else {
//N - x^2 < 0的条件
while (N.compareTo(x.multiply(x)) < 0) {
//导入公式(x+a/x)/2
x = x.add(N.divide(x)).divide(two);
}
System.out.println(x);
}
}
}
class _07Reader {
static BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
static String next() throws Exception {
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(br.readLine());
}
return tokenizer.nextToken();
}
static String nextLine() throws Exception {
return br.readLine();
}
static int nextInt() throws Exception {
return Integer.parseInt(next());
}
}
expandir
Esta es la demanda BigDecimal método de la raíz cuadrada, se encontró con un problema tal que decir que primero se paró ...
Java BigDecimal calcular la raíz cuadrada utilizando el método iterativo de Newton