16-значные числа вписываются в диапазон 64-разрядного числа, поэтому вам следует использовать uint64_t
(из <stdint.h>
). Оператор %
должен делать то, что вам нужно.
Если вам нужны большие числа, вам нужно использовать библиотеку с большими целыми числами. Однако, если все, что вас интересует, это модуль, вы можете воспользоваться трюком, основанным на следующих свойствах модуля :
mod(a * b) == mod(mod(a) * mod(b))
mod(a + b) == mod(mod(a) + mod(b))
В качестве примера, давайте выразим 16-значное десятичное число, x
как:
x = x_hi * 1e8 + x_lo; // this is pseudocode, not real C
, где x_hi
- это 8 наиболее значащих десятичных цифр, а x_lo
- наименее значимые. Модуль x
может быть выражен как:
mod(x) = mod((mod(x_hi) * mod(1e8) + mod(x_lo));
, где mod(1e8)
- это константа, которую можно предварительно рассчитать.
Все это можно сделать в целочисленной арифметике.