Почему при умножении 1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17 получается совсем что-то не то?

При умножении чисел от 1 до 17 (1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17) может произойти переполнение целочисленного типа данных, если используется тип с фиксированной точкой, например, тип int.

Тип int в большинстве языков программирования представляет собой 32-битное целое число, что означает, что значение в этом типе может быть представлено с помощью 32 битов. Диапазон значений для типа int в C++ составляет -2,147,483,648 до 2,147,483,647. Это означает, что в случае умножения чисел, превышающих этот диапазон, может произойти переполнение.

В вашем случае, умножение чисел от 1 до 17 приводит к результату 355687428096000, что явно превышает максимальное значение типа int. Когда происходит переполнение в типе int, результат обычно обрезается по модулю максимального значения типа int, поэтому в итоге получается неожиданный результат.

Чтобы решить эту проблему, можно использовать тип данных с плавающей точкой, такой как double или long double, который обеспечивает большую точность и диапазон значений. Например, если вы используете тип double, результат умножения будет равен 3.55687428096E+14, что является правильным значением для данного умножения.