Sword se refiere a ofrecer-47-no sumar, restar, multiplicar ni dividir para sumar-java

Preguntas y pruebas

package sword047;
/*   写一个函数,求两个整数之和,要求在函数体内不得使用+,-,x,÷四则运算符号。

*/

import java.util.List;

public class main {
	
	public static void main(String[] args) {
		int [] testTable = {1,8,21};
		int [] testTable2 = {4,9,32};
		for(int i=0;i<testTable.length;i++){
			test(testTable[i],testTable2[i]);
		}
	}
		 
	private static void test(int ito,int ito2) {
		Solution solution = new Solution();
		int rtn;
		long begin = System.currentTimeMillis();
		System.out.print(ito+"  ");
		System.out.print(ito2);
		System.out.println();
		//开始时打印数组
		
		rtn= solution.sum(ito,ito2);//执行程序
		long end = System.currentTimeMillis();	
		
		System.out.println("rtn=" );
		System.out.print(rtn);	
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

Solución 1 (éxito)

Esta pregunta se hizo durante la entrevista. Primero, analizamos cómo las personas realizan sumas decimales, por ejemplo, cómo obtener el resultado de 5 + 17 = 22. De hecho, podemos proceder en tres pasos: el primer paso es solo hacer Todos se agrega sin un acarreo. En este momento, el resultado de la suma es 12. El segundo paso es un acarreo. Hay un acarreo en 5 + 7, y el valor del acarreo es 10; el tercer paso es sumar el los dos resultados anteriores a 12 + 10 El resultado es 22, que es exactamente 5 + 17 = 22

Hemos estado pensando que las cuatro operaciones aritméticas para la suma de dos árboles no se pueden usar, ¿qué más se puede usar? Además de las cuatro operaciones aritméticas con números, solo quedan operaciones con bits. Las operaciones de bits son para binarios, así que usemos binarios para analizar si la estrategia de tres pasos anterior también es aplicable a binarios.

El valor binario de 5 es 101 y el valor binario de 17 es 10001. Intente dividir el cálculo en tres pasos: el primer paso es sumar los bits sin contar el acarreo, y el resultado es 10100; el segundo paso es anote el acarreo. En este ejemplo, el acarreo solo se genera cuando se agrega el último dígito y el resultado es 10 en binario. En el tercer paso, se agrega el resultado de los dos primeros pasos y el resultado es 10110, que es exactamente 22 cuando convertido a decimal Se puede ver que hay tres La estrategia paso a paso también es aplicable a binarios.

A continuación, intentamos reemplazar la suma binaria con operaciones bit a bit. El primer paso no considera el acarreo para agregar a cada bit. El resultado de 0 + 0, 1 + 1 es 0 y el resultado de 1 + 0 es 1. El resultado de 0 + 1 es 1. Notamos que esto es lo mismo que el resultado de XOR. Para XOR, el resultado del XOR de 0 y 0, 1 y 1 es 0, y el XOR de 0 y 1, y el resultado de 1 y 0 es i1. Luego, considere el segundo bit de paso, para 0 + 0, 0 + En lo que respecta a 1, 1 + 0, no habrá acarreo, cuando solo haya 1 + 1, generará un arrastre. En este punto, podemos imaginar que primero se operan dos números bit a bit y luego se mueven un bit hacia la izquierda. Solo cuando ambos números son 1. El tercer paso para agregar es repetir los dos pasos anteriores hasta que no se genere ningún acarreo.

package sword047;

public class Solution {
	public int sum(int x, int y) {
		if(y==0) {
			return x;
		}
		return sum(x ^ y, (x & y) << 1);
	}
}

 

Supongo que te gusta

Origin blog.csdn.net/xushiyu1996818/article/details/112506631
Recomendado
Clasificación