例题5:0-1间浮点实数的的二进制表示
给定一个介于0-1之间的实数,(如0.625),类型为double,打印它的二进制表示。如果该数字无法精确的用32位以内的二进制表示则打印“ERROR”。
public class 二进制小数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
double num = 0.625;
StringBuilder sb = new StringBuilder("0.");
while(num>0) {
double r = num*2;
if(r>=1) {
sb.append("1");
num=r-1;
}
else {
sb.append("0");
num=r;
}
if(sb.length()>34) {
System.out.println("ERROR");
return;
}
}
System.out.println(sb.toString());
}
}
例题六:出现K次与出现一次
数组中只有一个数出现一次,其他的数都出现了K次,请输出只出现了一次的数。
题意理解:首先,我们要知道两个相同的二进制数做不进位加法,结果为0;
10个相同的10进制数做不进位加法,结果为0;
K个相同的K进制数做不进位加法,结果为0.
public class 出现K次 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};//用于测试的数组
int len = arr.length;
char[][] kRadix = new char[len][];//定义一个二维数组用来存放每个数的3进制表示
int k = 3;//重复出现的次数
int maxLen = 0;//一个数转成3进制字符数组后最大的长度
//把每个数转化成3进制:这里用二维字符数组存放,因为后面要做不进位加法,所以通过把得到的3进制字符串给翻转,使得个十百等每一位对齐。
for(int i =0;i<len;i++) {
kRadix[i] = new StringBuffer(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
//找到最大的长度
if(kRadix[i].length>maxLen) {
maxLen = kRadix[i].length;
}
}
//用来存放做不进位后每一位的值
int resArr[] = new int[maxLen];
//求每一位的和
for(int i = 0; i <len;i++) {
for(int j =0;j<maxLen;j++) {
if(j>=kRadix[i].length) {
resArr[j] += 0;
}
else {
//字符在进行加减运算的时候按照ASCALL编码转换成了数值
resArr[j] += kRadix[i][j];
}
}
}
int res = 0;
for(int i=0;i<maxLen;i++) {
res += ((resArr[i]%k) * (int)(Math.pow(k, i)));
}
System.out.println(res);
}
}