如何比较int数组中存储的大整数?

时间:2016-07-01 18:41:06

标签: c# arrays biginteger compareto

我正在尝试在C#中实现BigInteger类。现在我被困在一个名为-1的方法中。这是我的班级和相应的方法。

isLessThan(HugeInteger b)

基本上,对于每个HugeInteger对象,我有40位数存储到整数数组中。但我确信我的方法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; } } 是错误的,而且我忽略了一些简单的事情。那么我应该如何制定正确的isLessThan(HugeInteger b)方法呢?

编辑: 我的isLessThan方法对某些情况不起作用,比如我试图比较&#34; 9873&#34;和&#34; 75&#34;,我得到isLessthan(HugeInteger b),但我需要一个true。对不起,不清楚。

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

3 个答案:

答案 0 :(得分:1)

好的,让我们实施比较;典型的方式使用通用比较(在某些语言中,它甚至有一个特殊的运算符<=>

  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
    }

实施比较器后,可以很容易地编写isLessThanisGreaterThan

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

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

答案 1 :(得分: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&lt; 5.与我的更改一样,一旦比较9和0,它将返回false。

答案 2 :(得分:0)

当发生溢出时,CPU的条件代码被设置为使得后续指令可能失败以提供正确的结果,因此如果您在发生溢出之前没有预测到溢出,那么您所有的奇特逻辑都是徒劳的。

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

if(MUCHTOOLARGENUMBER&gt; SOMEREASONABLEVALUE){

然后我没有保证测试将评估哪种方式。)