以10进制数“1234”为例
数码:数中的每一个数字。1、2、3、4
位数:数码在这个数中的位置。从右到左开始递增。如4的位数是0;1的位数是3
基数:每一位数码可以有多少个数字来表示。十进制的基数是十;二进制的基数是二
位权:对于多位数,处在某一位的“1”所表示的数值的大小。十进制的第二位的位权是10,第三位的位权是100。公式为 基数的位数次
基础知识补充完了。问题来了——
负二进制数相加
给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。
数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 中的数字 arr 也同样不含前导零:即 arr == [0] 或 arr[0] == 1。
返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组
来源:力扣(LeetCode)
1、前导0和后导0
前导0:int a= 01 此时可以输入,参与运算,输出(前导0被忽略)可以使用格式化%02d 表示不足两位数字在数字面前加0.
后导0:%.2f
2、不需要导0
一、 利用类型转换 double转为int类型
二、利用正则表达式 去掉多余的0和.
三、利用字符串操作 double——String——arry[]
1 public int[] addNegabinary(int[] arr1, int[] arr2) { 2 int i = arr1.length - 1, j = arr2.length - 1, carry = 0; 3 Stack<Integer> stack = new Stack<>(); 4 while (i >= 0 || j >= 0 || carry != 0) { 5 int sum = carry; 6 if (i >= 0) sum += arr1[i--]; 7 if (j >= 0) sum += arr2[j--]; 8 stack.push(sum & 1); 9 carry = -(sum >> 1); // 注意这里的负号 10 } 11 while (!stack.isEmpty() && stack.peek() == 0) { 12 stack.pop(); 13 } 14 if (stack.isEmpty()) { 15 return new int[]{0}; 16 } 17 int[] res = new int[stack.size()]; 18 for (int k = 0; !stack.isEmpty(); k++) { 19 res[k] = stack.pop(); 20 } 21 return res; 22 }
该解决方案使用栈来存储计算结果。从数组的最后一位开始相加,如果有进位,则将进位保存到变量carry中。由于是基数为-2,因此进位是负数,需要将sum向右移位并加上负号。将每次相加的结果的最后一位保存到栈中,最后将栈中的元素转换为数组形式返回即可。注意在转换数组的时候需要注意去除前导零。
再来看官方的解析:
标签:计算机,int,sum,arr2,carry,基数,stack From: https://www.cnblogs.com/liang9479/p/17412612.html