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);
}
}
笔记展示:
慢慢品吧!