Первая статья: Факториал, НОД, НОК
Запись от Dani размещена 12.02.2012 в 12:47
Показов 63022
Комментарии 13
|
Часто приходится наблюдать вопросы\просьбы насчет довольно тривиальные функции. Т.к. это старая тема, я решил все, что придумаю собрать сюда. При нахождении ошибок и предложений, прошу сообщать в ЛС. И так, поехали: Задача: вычислить n!. Решение: Факториал(n) – это произведение всех натуральных чисел от 1 до n. Причем, 0!=1. Ну, собственно, решение при помощи рекурсии: C++
C++ (цикл For):
Pascal(цикл For):
Но бывают случаи, когда необходимо вычислить, например 1000!. В этом случае, прибегают к использованию длинной арифметики. «Длинная арифметика — в вычислительной технике операции над числами, разрядность которых превышает длину машинного слова данной вычислительной машины», - говорит нам Википедия. Задача: вычислить НОД (a,b). Решение: НОД – наибольший общий делитель двух целых чисел. Например, НОД (12, 15) = 3. НОД двух взаимно-простых чисел равен 1. В свое время я мучился с НОД (0,0), по этому подому Википедия сообщает: «Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел m или n не ноль.». В разделе «C++ для начинающих», существует тема, посвященная НОДу - https://www.cyberforum.ru/cpp-... 65854.html . Реализация через остатки на Pascal
Задача: вычислить НОК (a,b) Решение: НОК – наименьшее общее кратное двух целых чисел (такое минимальное число, которое делится как на первое, так и на второе число). Например, НОК(12,15) = 60. Существует формула нахождения НОК(a,b): НОК(a,b)=(a*b)/НОД(a,b). НОК – всегда натуральное число, поэтому НОК(5,0) – не существует, т.к. на ноль делить нельзя. C++
| |||||||||||||||||||||||||||||||||||||||||||||
Размещено в По теме программирования
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 13
Комментарии
-
Запись от Evg размещена 12.02.2012 в 13:14
-
Извиняюсь за такой стиль: давно он у меня уже, и свыкся с ним я)Запись от Dani размещена 12.02.2012 в 13:18
-
Запись от Evg размещена 15.02.2012 в 19:43
-
Запись от turbanoff размещена 16.02.2012 в 12:54
-
Для 31\32: 479001600 или 12!
Для 63\64: 2432902008176640000 или 20!Запись от Dani размещена 17.02.2012 в 21:27
-
Факториал отрицательного значения приведёт к зацикливанию программы(попробуй ввести -2)
Вот простая рекурсивная функция для его вычисления
Ниже лаконичный алгоритм для факториала с проверкой корректности вводаC++ (Qt) 1 2 3 4 5 6 7
unsigned long fact(unsigned long n) { unsigned long ret = ((n == 0) ? (n = 1) : n); if(1 < (n = n - 1)) ret = ret*fact(n); return ret; }
Отработка алгоритмаC++ (Qt) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <iostream> using namespace std; unsigned long fact(unsigned long n) { unsigned long ret = ((n == 0) ? (n = 1) : n); if(1 < (n = n - 1)) ret = ret*fact(n); return ret; } int main() { unsigned long n; while(true) { cout<<"Enter n : "; if(!(cin>>n)) cout<<"Input error\n"; else cout<<"n! = "<<fact(n)<<endl;; } return 0; }
Enter n : 0
n! = 1
Enter n : 1
n! = 1
Enter n : 5
n! = 120
Enter n : 10
n! = 3628800
Enter n :Запись от -=ЮрА=- размещена 02.04.2012 в 19:48
-
Факториал определён только для целых неотрицательных чисел. А проверка - это уже добавочное. В идеале надо проверять на корректность ввода: вводить сткорой, смотреть есть ли символы или через исключения и т.д. Я написал самое основное, это предполагает корректный ввод. Остальные "фишки" остаются пользователю
Запись от Dani размещена 12.04.2012 в 23:59
-
да и ваша программа зацикливается, если ввести aЗапись от Dani размещена 13.04.2012 в 00:01
-
Запись от -=ЮрА=- размещена 03.05.2012 в 13:07
-
Это описано выше.Запись от Dani размещена 03.05.2012 в 22:06
-
Для автора этого блога(все остальные проходите мимо!)Dani , потом удалишь эту запись
Ссылка для скачивания файла: http://rusfolder.com/32756563
я неуверен что ЛС форума быстра, поэтому сюда запостилЗапись от -=ЮрА=- размещена 21.09.2012 в 19:19
-
Если требуется вычислить N! при N>1000 ...
А что мешает сначала вычислить lg(N!)?
Вы получите порядок числа (ну и мантиссу)Запись от echs размещена 07.11.2015 в 16:32
-
Меня вот что интересует.
Давно ли в паскале вместо сложения стали писать OR?
Nod:= a or b; (!!) - ЭТО ВАШ КОД.Запись от echs размещена 27.06.2016 в 20:49



