【问题标题】:Big negative integer representation in a LinkedListLinkedList 中的大负整数表示
【发布时间】:2014-06-20 17:59:31
【问题描述】:

我的 LinkedList 通过在每个节点中有一个数字来表示大数字。

我可以使用以下代码在 LinkedList 中表示正大整数:

public BigInteger(int x) 
{
    list = new LinkedList<Integer>();
    while (x > 0) 
    {
        list.push(( x % 10 ));
        x = x / 10;
    }
}

声明:

BigInteger bigPositive = new BigInteger(91234) 

生产:

 [9,1,2,3,4]

但是,我不确定如何表示大的负整数,例如 -9321312345

【问题讨论】:

  • BigInteger 是你自己的班级吗?已经有一个大整数实现。
  • 这将比java.math.BigInteger 更复杂(制作)和慢很多,但如果你是为了好玩,这可能是一个有趣的项目
  • 这似乎非常低效。您正在为每个数字存储一个列表节点和一个 BigInteger。然后是以十进制存储它的问题,这将使算术“有趣”。这只是为了您的教育还是您打算在某处的“生产”代码中使用它?顺便说一句,只需向您的班级添加一个boolean 符号(true=negative,false=positive)成员。
  • 这只是为了我自己的教育。我正在尝试学习如何实现我自己的 LinkedList,这只是我遇到的问题之一。最终,我想制作可以对 LinkedList 执行简单算术运算的方法,所以我想知道如何处理负数。
  • 将符号存储为额外的 int 字段,例如 -1、0 或 +1

标签: java list data-structures linked-list


【解决方案1】:

您可以将 1 或 0 推到列表的前面,指示它是正数还是负数。例如:

  • (15) 将映射到 [1 1 5]
  • (-13) 将映射到 [0 1 3]
  • (1) 将映射到 [1 1]

等等。您只需知道将第一个数字解释为符号 (+/-),而不是值的一部分。

【讨论】:

    【解决方案2】:

    如果 BigInteger 是您自己的自定义类,您可以添加一个布尔属性来确定整数是正数还是负数。

    然后,在您的构造函数中,您可以确定整数的符号并相应地设置该属性。

    【讨论】:

      【解决方案3】:

      public BigInteger(int x)int x 的这个值输入本身就是限制,所以你永远不能超过。

      为什么不直接拥有?

      public BigInteger(int x){
         bigIntValue = x;
      }
      

      因为那不是重点。您希望能够从输入中创建大于预期 int 的值。

      IMO 更好的选择是添加 String 作为输入,然后有一个操作可以将 int's 或您想要的东西推到 linklist 的后面或前面。

      public BigInteger(String x) 
      {   
          int endLoop = 0;
          list = new LinkedList<char>();
          // have a boolean for negative in your class then multiple by 
          // negative one to your operations if its true.
          if(x.charAt(0) == '-'){
              this.negative = true;
              endLoop = 1;
          }
          list = new LinkedList<char>();
          int i = x.length() - 1;
          while(i >= endLoop) {
              if(!validNumber(x.charAt(i)) //fail 
      
              list.push(( x.charAt(i)));
              i--;
          }
      
      }
      
      // this checks if it's a number.
      boolean validNumber(char n){
          for(int i = 48; i =< 57; i++){
              if(n = i) return true;
          }
          return false;
      
      }
      

      如果需要,您甚至可以通过编写从 char 到 int 的转换器将列表的类型更改为 int。

      【讨论】:

        【解决方案4】:

        你可以在二进制中做同样的事情;通过让第一位数字确定符号

        0b0100 ==  4
        0b1100 == -4
        

        同样你可以写

        {0, 1, 1} ==  11 
        {1, 1, 1} == -11, 
        

        虽然这偏离了最初的想法;因为你正在使用整数,你可以这样做:

        {-1, 1} == -11 
        { 1, 1} ==  11
        

        【讨论】:

          猜你喜欢
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多