![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
{
unsigned i = 0; // Текущее значение i
unsigned F = 1; // Текущее значение i!
while (i < n)
{
++ i; // i = i + 1
F *= i; // F = F * i - текущее значение i!
}
return F; // Возвращаем значение n!
}
Недостатком этой реализации является то, что с помощью этой функции можно вычислить n! только для n от 0 до 12. Значение 13! уже выходит за верхнюю границу диапазона значений типа unsigned и функция начинает возвращать неверные значения факториала. Для предотвращения получения неверных значений факториалов модифицируем функцию следующим образом:
Unsigned Factorial (unsigned n)
{
unsigned i = 0; // Текущее значение i
unsigned F = 1; // Текущее значение i!
while (i < n)
{
++ i; // i = i + 1
if (0xffffffffu / i < F) // 0xffffffffu – максимальное значение типа unsigned
{
F = 0;
Break;
}
F *= i; // F = F * i - текущее значение i!
}
return F; // Возвращаем значение n!
}
Добавленная проверка обнаруживает ситуацию, когда умножение предыдущего значения факториала на следующее значение i приведет к выходу полученного значения произведения за верхнюю границу диапазона значений типа unsigned. В этом случае значению факториала присваивается значение 0 (факториал любого числа всегда больше 0), и с помощью инструкции break выполнение цикла прерывается. В этом случае функция вернет значение 0.
При такой реализации функцию Factorial в программе можно использовать, например, так:
Дата публикования: 2014-11-26; Прочитано: 158 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!