计算机——基数

以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向右移位并加上负号。将每次相加的结果的最后一位保存到栈中,最后将栈中的元素转换为数组形式返回即可。注意在转换数组的时候需要注意去除前导零。

 

再来看官方的解析:

 

posted @ 2023-05-18 20:14  濑川一线天  阅读(737)  评论(0)    收藏  举报