蓝桥杯算法基础(4):位运算(题5:0~1间浮点数的二进制表示,题7:出现K次与出现1次)(java代码)

 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);

    }

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值