题目
小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少
代码
public static int solution(int N) {
// write code here
String s=Integer.toBinaryString(N);
char[] ss=s.toCharArray();
int[] a=new int[ss.length];
int result=0;
int count=0;
//反码
for(int i=0;i<ss.length;i++){
if(ss[i]=='0')ss[i]='1';
else ss[i]='0';
}
for (int i = 0; i < ss.length; i++) {
a[i] = Character.getNumericValue(ss[i]);
}
for(int i=ss.length-1;i>=0;i--){
result+=Math.pow(2, count)*a[i];
count++;
}
return result; // Placeholder return
}
public static void main(String[] args) {
System.out.println(solution(5) == 2 ? 1 : 0);
System.out.println(solution(10) == 5 ? 1 : 0);
System.out.println(solution(0) == 1 ? 1 : 0);
}
}
解析
1.分析题目
看到题目后,我们首先要分析题目要解决什么样的问题,用户输入格式通过什么样的算法能拿到正确的输出结果,在这个问题中,可以看到,输入一个十进制数字,要求输出该数字二进制反码的十进制形式,那么我们首先需要将该十进制数字转换为二进制形式,再求出该二进制的反码,最后将二进制反码转换为十进制数字输出。
2.解决问题
首先我们可以通过Integer.toBinaryString将十进制转换为二进制字符串,在反码转换中,我们需要将二进制字符串转换为字符数组,遍历数组的每一个元素,将其转换得到反码字符数组,再将二进制转换为十进制时,我这里是将字符数组转换为整型数组,再根据二进制转十进制规则,通过一个循环遍历数组每个元素,去实现该步骤。大家如果有更好的方式可以分享分享哦。
3.易错
在最后二进制转换十进制这部分代码中,要注意循环变量i和计算十进制时2的次方数之间的关系以及二进制数组下标,我一开始习惯性将i设为从0到数组长度这样去遍历,忽略了这点,在这一步一定要分析好各个变量之间的关系,以及二进制转十进制正确的计算过程。