Определить, каким количеством цифр "0" заканчивается запись числа N! в K-ичной системе счисления - C (СИ) (148881)
Формулировка задачи:
А как определить, каким количеством цифр "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
Листинг программы
// conver number cc K.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
char int_symbol(int in){
char out[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
return out[in];
}
void ten_base(int in, int base){
if (in<base) {
std::cout << int_symbol(in);
return;
}
ten_base(in / base, base);
std::cout << int_symbol(in%base) ;
}
//вычисляем факториал
int fact(int x)
{
if (x == 1)
return 1;
else
return x*fact(x - 1);
}
int main(){
//setlocale(LC_ALL, "");
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int in;
int base;
cout << "Ведите число" << endl;
std::cin >> in;
int m = fact(in);
cout << "факториал числа " << in << "!=" << m<< endl;
cout << "Ведите конечную систему счисления" << endl;
std::cin >> base;
cout << "Результат перевода факториала в к ричную систему" << endl;
ten_base(m, base);
cout << endl;
system("pause");
return 0;
}
Объяснение кода листинга программы
- Объявление функции
char int_symbol(int in), которая преобразует целое число в символ, используя таблицу символов. - Объявление функции
void ten_base(int in, int base), которая выводит число в десятичной системе счисления. - Вычисление факториала с помощью рекурсивной функции
int fact(int x). - Объявление функции
main(), которая является точкой входа в программу. - Ввод числа и факториала числа в консоль.
- Ввод конечной системы счисления.
- Вызов функции
ten_base(m, base)для перевода факториала в выбранную систему счисления. - Вывод результата в консоль.
- Ожидание нажатия клавиши для завершения программы.
- Возврат значения 0, указывающего на успешный завершение программы.