2013-07-07 5 views
1

Как выполнить (A div B) mod C, где я вычисляю A в одной функции, B в другой функции, а C - (10 pow 9 плюс 7), но как A, так и B могут быть больше C или INT_MAXКак выполнять математические функции, которые могут превышать LONG_MAX

+1

Затем вы используете 'долго long' ... –

+0

что, если даже долго долго не может .. ??, как, скажем, А в моем расчете выходит 10 pow 100? –

+0

Тогда вы google "GMP". –

ответ

1

если единственная проблема - это размер чисел, которые вы можете использовать долго. если число может быть больше, чем long.MAX_VALUE, тогда вам потребуется некоторая функция для вычисления с использованием строк или использование двух или более типов long и создание собственных функций. например, функция плюса получит два типа 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; 
    } 
}