Title

数字的补数

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。

 

示例 1:

输入:num = 5
输出:2
解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。
示例 2:

输入:num = 1
输出:0
解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。
 

提示:

1 <= num < 231

import java.util.Scanner;

public class Test {
    public static class ListNode{    //定义单链表
        public int e;
        public ListNode next;
        ListNode() {}
        ListNode(int e) { this.e = e; }
        ListNode(int e, ListNode next) { this.e = e; this.next = next; }
    }
    ListNode head;
    int size;
    public void LinkedList(){   //初始化头结点
        head = new ListNode(0 ,null);
        size = 0;
    }
    public void insert(int number){    //插入元素进链表
        ListNode temp = head;
        // 1、先让要添加的节点指向temp的下一个节点
        ListNode newNode = new ListNode(number,temp.next);
        // 2、再将temp的next指向node
        temp.next = newNode;
        size++;   //链表长度加1
    }
    public int re(int number){   //二进制取反
        if(number == 1){
            return 0;
        }else {
            return 1;
        }
    }
    public static void main(String[] args) {
        Scanner print = new Scanner(System.in);
//        int i = print.nextInt();   //输入
        int j = 0,num = 0,m;
        int i = 2;
        m = i;   // 保存i值;
        Test test = new Test();
        test.LinkedList();
        if(i<0){      //判断正负
            i = -i;
        }
        while (i!=0){
            j = test.re(i%2);
            test.insert(j);
            i = i/2;    //重置

        }
        ListNode p = test.head.next;   //定义单链表头结点下一个结点p
        for (int k = test.size-1; k >= 0; k--) {   //求十进制,得到补数
            num += (int)Math.pow(2,k)*p.e;
            p = p.next;
        }
        if(m<=0){
            System.out.println(-num);
        }else {
            System.out.println(num);
        }
    }
}

 

posted @ 2022-03-30 17:12  WAASSTT  阅读(399)  评论(0)    收藏  举报
Title