Определить, каким количеством цифр "0" заканчивается запись числа N! в K-ичной системе счисления - C (СИ) (148885)
Формулировка задачи:
Факториалом натурального числа N (обозначается N!) Называется произведение всех натуральных чисел от 1 до N включительно: N! = 1 × 2 × 3 × ... × N.
Нужно определить, каким количеством цифр "0" заканчивается запись числа N! в K-ичной системе счисления.
// factorial.cpp: определяет точку входа для консольного приложения. /* Факториалом натурального числа N (обозначается N!) Назывется произведение всех натуральных чисел от 1 до N включительно: N! = 1 Г— 2 Г— 3 Г— ... Г— N. Нужно определить, каким количеством цифр "0" заканчивается запись числа N! в K-ичной системе счисления. */ #include "stdafx.h" #include <windows.h> #include <iostream> #include <string> using namespace std; string zel(int a[], int la, int q, int p, string u) { string c = ""; int snos, j; do { j = 0; snos = 0; for (int i = 0; i<la; i++) { snos *= q; snos += a[i]; if ((snos<p) && (i) && (j)) { a[j] = 0; j++; } if (snos >= p) { a[j] = snos / p; snos = snos%p; j++; } } c = u[snos] + c; la = j; } while (la); return c; } int fact(int x) { if (x == 1) return 1; else return x*fact(x - 1); } int main() { setlocale(LC_ALL, "Russian"); int n=0; INT m = 0; //Вычислляем факториал printf("Введите число n: "); scanf("%d", &n); m = fact(n); n <= 0 ? printf("Nevernoe znachenie!\n") : printf("%d! = %d\n", n, m); //Переводим факториал в конечную систему счисления string u("0123456789ABCDEF"), a; int q, p; cout << "Введите число: "; cin >> a; cout << "Введите исходную систему счисления: "; cin >> q; cout << "Введите конечную систему счисления: "; cin >> p; int la = a.size(); int *array = new int[la]; for (int i = 0; i <= la; i++) array[i] = u.find(toupper(a[i])); cout << string(80, '_') << zel(array, la, q, p, u) << endl; //считаем число цифр 0 system("pause"); return 0; }
Решение задачи: «Определить, каким количеством цифр "0" заканчивается запись числа N! в K-ичной системе счисления»
textual
Листинг программы
#include <iostream> using namespace std; int f(int n, int i) { return n ? n/i + f(n/i, i) : 0; } int g(int n, int k) { int r=n; for (int i=2; i*i<=k; i++) { int p=0; while (k%i==0) {p++; k/=i;} if (p) r = min(r, f(n,i)/p); } if (k>1) r = min(r, f(n,k)); return r; } int main() { int n,k; cin>>n>>k; cout<<g(n, k); }
Объяснение кода листинга программы
В этом коде решается задача о определении количества цифр 0
в записи числа N! в K-ичной системе счисления.
Список действий:
- В функции f(n, i) происходит вычисление факториала числа n. Рекурсивный алгоритм вычисляет значение n/i и вызывает функцию f(n/i, i) до тех пор, пока n/i не станет равным 0. Когда это произойдет, функция возвращает сумму всех полученных значений.
- В функции g(n, k) происходит вычисление количества цифр
0
в записи числа n в K-ичной системе счисления. Функция использует алгоритм поиска простых делителей числа k и находит наименьшее значение p, которое является количеством цифр0
в записи числа n в K-ичной системе счисления. Если k больше 1, то функция использует функцию f(n, k) для вычисления количества цифр0
в записи числа n в K-ичной системе счисления. - В функции main() происходит ввод чисел n и k с помощью функции cin, а затем выводится результат вычисления функции g(n, k) с помощью функции cout.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д