51Nod-1166 un gran número de raíz cuadrada (versión Java)

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

Publicado 60 artículos originales · ganado elogios 4 · Vistas 1250

Supongo que te gusta

Origin blog.csdn.net/qq_43966129/article/details/105369089
Recomendado
Clasificación