unsigned int
имеет диапазон значений от 0
до 2^32-1
или 2^32 = 4,294,967,296
.Присвоение result
значения выше 2^32-1 = 4,294,967,295
приводит к переполнению значения.Это просто означает, что он возвращается к 0
, после чего может снова увеличиться до 4,294,967,295
.
Первое переполнение происходит при вычислении 13!
, когда мы ожидаем, что значение result
будет13! = 6,227,020,800
.Однако мы не приняли во внимание переполнение.Вместо этого значение result
будет равно оставшейся части уравнения 13! % 2^32
, или 1,932,053,504
, потому что именно так увеличивается result
после последнего (и, в данном случае, только) цикла до 0
.
Теперь 33!
или 34!
представляют значения, которые невообразимо велики и вызывают переполнение result
много раз.Мы можем вычислить, сколько раз 33!
вызывает переполнение, просто разделив его на 2^32
, что приведет к переполнению 2.02e27
.Однако ваш вопрос касается не количества переполнений, а значения остатка после последнего переполнения.В этом случае он равен 33! % 2^32 = 2,147,483,648
.Мы можем сделать то же самое для 34
: 34! % 2^32 = 0
.
Это означает, что, по совпадению, 2^32
является правильным делителем 34!
.Или это не случайно после всех ?
Редактировать : как и другие предлагали, вам следует взглянуть на библиотеку GMP Bignum без ограничений в точности арифметики, кроме вашей машины.