Diario de novatos-21 de enero
Caso numero uno
Representa números de punto flotante en binario
La premisa es tener una precisión de 32 bits; de lo contrario, se informará un error
Tales como: 0.625
public class 二进制表示浮点数 {
public static void main(String[] args) {
double num = 0.625;
StringBuilder sb = new StringBuilder("0.");
while (num > 0){
//乘2挪整
double q = num * 2;
if (q >= 1){
sb.append("1");
num = q - 1;
}
else {
sb.append("0");
num = q;
}
}
if (sb.length() > 34){
System.out.println("ERROR");
return;
}
System.out.println(sb.toString());
}
}
Diagrama:
Imagen de efecto:
Caso 2:
K ocurrencias y 1 ocurrencia
En una matriz de números, un número aparece una vez y otros números aparecen k veces, encuentre el número que aparece una vez (sin espacio auxiliar)
1. Primero construye una matriz bidimensional
public class 出现k次 {
public static void main(String[] args) {
int[] arr = {
3,3,3,5,5,5,15,9,9,9,11,11,11};
int len = arr.length;
char [] [] kRadix = new char[len][];
int k = 3;
int maxLen = 0;
2. Convierta cada número en una matriz de caracteres en base k
for (int i = 0; i < len; i++) {
//先转换为k进制的数组,再反转并转换为字符数组
kRadix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
maxLen表示最长的k进制长度
//如9三进制为100有三位,4为11有两位
if (kRadix[i].length > maxLen)
maxLen = kRadix[i].length;
}
3. Agregar sin llevar
int[] reaArr = new int[maxLen];
for (int i = 0; i < len; i++) {
for (int j = 0; j < maxLen; j++) {
//补位,不足maxLen位则用0补齐
if (j >= kRadix[i].length) {
reaArr[j] += 0;
}
else {
//字符转换为整数数字
reaArr[j] += (kRadix[i][j] - '0');
}
}
}
4. Elimina otros números
int res = 0;
for (int j = 0; j < maxLen; j++) {
//每一列的和除以k,然后乘以k的i次方,并相加
//除了出现一次那个数的各位数的列的和,其他的都会因除以k而被消掉
res += (reaArr[j] % k) * (int) (Math.pow(k,j));
}
System.out.println(res);
}
}
Diagrama:
Imagen de efecto: