菜鸟日记—1月21日
案例一
用二进制表示浮点数
前提,要精确到32位之内,否则报错
如: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());
}
}
图解:
效果图:
案例2:
出现k次与出现1次
一个数字数组中,一个数字出现一次,其他数字出现k次,找出出现一次的这个数(不用辅助空间)
1.先构造一个二维数组
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.将每个数字转换为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.不进位加法
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.消掉其他数
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);
}
}
图解:
效果图: