如何执行可能超过LONG_MAX的数学函数

时间:2013-07-07 05:56:42

标签: max modulo factorial exponentiation large-data

我如何执行(A div B)mod C,其中我在一个函数中计算A,在另一个函数中计算B,而C表示(10 pow 9 plus 7)但A和B都可能大于C,或INT_MAX

1 个答案:

答案 0 :(得分:1)

如果唯一的问题是您可以长时间使用的数字大小。如果数字可能比long.MAX_VALUE大,那么你需要一些函数来使用字符串计算,或使用两个或更多long类型,并自己创建函数。例如,plus函数将获得两个long类型,检查它们的总和是否小于其中一个(意味着它们超过MAX_SIZE),然后返回long的数组,包含数字,一个用于进位,一个用于总和。 这是c#中的一个例子,但很容易将其翻译成c ++

      public static string sum(long a, long b)
  {
     string sum;

     if (a + b > a && a + b > b)
     {
        sum = (a + b).ToString();
     }
     else
     {
        string aStr = a.ToString();
        string bStr = b.ToString();

        if (bStr.Length > aStr.Length)
        {
           string tmp = aStr;
           aStr = bStr;
           bStr = tmp;
        }

        sum = new string('0', aStr.Length + bStr.Length);
        char[] arr = sum.ToCharArray();

        for (int i = 0; i < bStr.Length; i++)
        {
           int loc = sum.Length - 1 - i;
           arr[loc] += (char)(aStr[aStr.Length - 1 - i] + bStr[bStr.Length - 1 - i] - '0' * 2);

           if (arr[loc] > '9')
           {
              arr[loc - 1] = '1';
              arr[loc] = (char)(arr[loc] - '9' - 1);
           }
        }

        for (int i = bStr.Length ; i < aStr.Length; i++)
        {
           int loc = sum.Length - 1 - i;
           arr[loc] += (char)(aStr[aStr.Length - 1 - i] - '0');


           if (arr[loc] > '9')
           {
              arr[loc - 1] = '1';
              arr[loc] = (char)(arr[loc] - '9' - 1);
           }
        }

        sum = new string(arr);

     }

     return sum;
  }
}