初心者日記-1月21日
ケースナンバーワン
浮動小数点数を2進数で表す
前提は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回
数値配列では、1つの数値が1回出現し、他の数値がk回出現し、1回出現する数を見つけます(補助スペースなし)
1.最初に2次元配列を作成します
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);
}
}
図:
効果画像: