如何比较存储在整型数组中的大整数

本文关键字:数组 整型 整数 存储 何比较 比较 | 更新日期: 2023-09-27 17:53:48

我正在尝试在c#中实现BigInteger类。现在我被困在一个叫做isLessThan(HugeInteger b)的方法上。这是我的类和相应的方法。

class HugeInteger
{
    public int[] array = new int[40];
    public HugeInteger(String s)
    {
        this.input(s);
    } // end constructor
    /*To read a huge integer having upto 40 digits, I am using an integer array to store 
      these values(input is read as a string for this matter) and later on will override 
      ToString() for output if needed.*/
    private void input(String s)
    {
        char[] charInteger = s.ToCharArray();
        int index = 0;
        for (int i = 0; i <= 39 - charInteger.Length; i++)
        {
            array[i] = 0;
        }
        for (int i = 39 - charInteger.Length + 1; i <= 39; i++)
        {
            array[i] = int.Parse(charInteger[index].ToString());
            index++;
        }
    }
    public bool isLessThan(HugeInteger that)
    {
        for (int i = 0; i <= 39; i++)
        {
            if (this.array[i] < that.array[i])
            {
                return true;
            }
        }
        return false;
    }
}

基本上,我有40个数字存储到一个整数数组中为每个HugeInteger对象。但我知道肯定我的方法isLessThan(HugeInteger b)是错误的,有一些简单的我忽略了。那么我该如何制定一个正确的isLessthan(HugeInteger b)方法呢?

编辑:我的isLessThan方法在某些情况下不起作用,例如,如果我尝试比较"9873"answers"75",我得到true,但我需要false。抱歉我没说清楚。

注意:我把我的输入(如9873或75)作为字符串,然后在我的input方法中将它们解析为int,然后将它们存储到整数数组中。

如何比较存储在整型数组中的大整数

好,让我们实现比较;典型的方法是使用通用比较(在某些语言中,它甚至有一个特殊的操作符<=>)

  class HugeInteger {
    ...
    // Universal comparator
    //  +1 left > right
    //   0 left == right
    //  -1 left < right
    public static int Compare(HugeInteger left, HugeInteger right) {
      // first, we should deal with null's; let null be the leaset possible value
      // left and right are just the references of one inctance?
      if (Object.ReferenceEquals(left, right)) 
        return 0;
      else if (left == null)
        return -1;
      else if (right == null)
        return 1;
      // Now we checked for null, let's compare both arrays  
      //DONE: no 39, 40 or other magic numbers, but Length 
      for (int i = 0; i < left.array.Length; ++i)
        if (left.array[i] < right.array[i])
          return -1;
        else if (left.array[i] > right.array[i])
          return 1;
      return 0; // no differences found, so left equals to right
    }

实现了比较器之后,很容易编写isLessThan, isGreaterThan:

    public bool isLessThan(HugeInteger other) {
      return Compare(this, other) < 0;
    }
    public bool isGreaterThan(HugeInteger other) {
      return Compare(this, other) > 0;
    }
    ....

如何修复你的方法

public bool isLessThan(HugeInteger that)
{
    for (int i = 0; i <= 39; i++)
    {
        if (this.array[i] < that.array[i])
        {
            return true;
        }
        if (this.array[i] > that.array[i])
        {
            return false;
        }
    }
    return false;
}

基本上,当你比较两个不相等的数字时,你就知道其中一个是大于还是小于另一个。只有当它们相等时才继续。你现在要做的就是检查第一个数字中是否至少有一个数字小于第二个数字。所以对于9873和75,它是成立的,因为3 <5. 在我的修改中,一旦比较9和0,它将返回false。

当发生溢出时,CPU的条件代码被设置为后续指令可能无法传递正确的结果,所以如果你没有在溢出发生之前预测到溢出,那么你所有的花哨逻辑都是徒劳的。

(你不能检测溢出:如果我问,例如,

)

if(muchtoolargennumber> SOMEREASONABLEVALUE) {

那么我不能保证测试将以哪种方式评估。