位运算符中的算法

         		  2020.2.3   17:05
        今天再补充两道题,第二道题相当有难度,至少我是这么认为的,视频讲解24分钟
        我自己把它弄懂,花了3个小时......不知道是我自己太笨了还是啥。
        话不多说了,直接上题。

在这里插入图片描述

题目一:给定一个介于0~1之间的实数,类型为double,求二进制表示结果。

  思路:首先可以回顾一下一个整数是怎样转换为2进制的,我们是将整数部分进行求余操作,
  那么在表示小数部分的时候也比较类似,比如一个小数0.625,我们在转换的时候是将这个
  数本身乘以2,保留整数部分,其余的小数去整之后继续去乘以2,如此往下进行操作。
  在写代码的时候,注意要用到StringBuilder进行拼接字符。

代码展示:

package LanQiaoKnowledgePractise;
//改写0~1之间的浮点小数为二进制    
public class Binary {
public static void main(String[] args) {
	double num=0.75;
	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());
	
}
}









附上笔记:(懒得手打)
在这里插入图片描述

题目二:数组中只有一个数字出现了1次,其他的数字出现了k次,请输出只出现了1次的数字。

		思路:我们这样思考,利用进制的思想,数字出现了k次,我们将它设为k进制的转换
		,利用进制之间的加法(详细的笔记会在下面的图片中展出),k个k进制的数字
		相加之和为0,那么,就只剩下出现了一次的数字,这个数字已经被转化称为了k进制,
		那么再把这个数字转换为10机制,就得到了这个数字。

代码展示:

package LanQiaoKnowledgePractise;

public class appearTeat {
	public static void main(String[] args) {
		int []arr= {2,2,2,5,7,7,7,8,8,8,3,3,3,6,6,6	};
		int len=arr.length;
		char[][]KRadix=new char[len][];
		int k=3;
		int maxlen=0;
		for(int i=0;i<len;i++) {
			KRadix[i]=new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
			if(KRadix[i].length>maxlen) {
				maxlen=KRadix.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]=resArr[i]+0;
				}
				else {
					resArr[j]=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);
		
		
		
	}
}

笔记展示:
在这里插入图片描述

在这里插入图片描述

慢慢品吧!
在这里插入图片描述

发布了6 篇原创文章 · 获赞 7 · 访问量 1339

猜你喜欢

转载自blog.csdn.net/qq_40645674/article/details/104159087
今日推荐