0~1间浮点数的二进制表示
给定一个介于0和1之间的实数,(如0.625),类型为double,打印它的二进制表示
(0.101,因为小数点后的二进制分别表示0.5,0.25,0.125....)
如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”
//以0.625为例,
//小数转二进制,乘2,然后扣掉整数部分的1
//0.625*2=1.25
//二进制表示小数0.1,1.25变为0.25
//0,25*2=0.5
//二进制表示小数0.10
//0.5*2=1.0
//二进制表示小数0.101
//0.1010
public static void main(String[] args){
double num=0.625;
StringBuilder sb=new StringBUilder("0.");
while(num>0){
double r=num*2;//乘二挪整
if(r>=1){
num=r-1;
sb.append("1");
}
else{
sb.append("0");
num=r;
}
if(sb.length()>34){
//sb是一个对象,而不是一个数组,数组求长度为.length,StringBuilder求长度为.length();
System.out.println("ERROR");
return;
}
}
System.out.println(sb.toString());
}
数组中只有一个数出现了1次,其它数都出现了k次,请输出只出现了1次的数
//222 8 777 333
(二进制加法)
// 011 3
//+011 3
//-----
// 110 6
//(十进制加法)
//123(10个十进制数相加,每位正好为10的整数倍,即每一位都需要进位,进位后,该位上为0)
//123(如:10.20.30,超过10都需要进位)
//...
//'''
//123
//(不进位加法)
//若是不进位加法,则进位之后,该位便为0,下一位不变
//即(10,20,30)按不进位加法,结果为(000)
//结论:
// 2个相同的二进制数做不进位加法,结果为零
// 10个相同的十进制数做不进位加法,结果为零
// k个相同的k进制数做不进位加法,结果为零
回到原题
数组中只有一个数出现了1次,其它数都出现了k次,请输出只出现了1次的数
//222 8 777 333
//即3个相同的3进制数做不进位加法,结果为零
//剩下的结果即为8
(转进制)
可手工取余,转进制8=2*3^1+2*3^0s
也可用方法Integer.toString(i,radix)方法直接转进制
public static void main(String[] args) {
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][];
int k;
//转成k进制字符数组
//对于每个数字
int maxlength = 0;
//求每个数字的三进制字符串并翻转,然后转为字符数组
KRadix[i] = new StringBuilder(toString(arr[i], k)).reverse().toString().toCharArray;
//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[j].length)
resArr[j] += 0;
else
resArr[j] += (kRadix[i][j] - '0');//字符换成数字
}
}
int res=0;
for(int i=0;i<maxlen;i++){
//
res+=(resArr[i]%k)*(int)Math.pow(k,i);//将每位上的数都取余进制数,最后剩下的为结果的二进制数,
}
System.out.println(res);
}