/*
Задача: Напишите программу, в которой сначала формируется целое число из N цифр, каждая из которых получается случайно
(N - натуральное число, не превосходящее 9, задается в программе константой).
Любая цифра может иметь значение от 1 до 9, а цифры в числе могут повторяться.
Далее определяет, сколько цифр встречаются в числе только один раз. Затем число и количество цифр выводятся на экран.
Например, если сформированное число 924322498, выводится число 2.
Программа состоит из четырех функций: generateRandomDigit(), generateNumber(), countUniqueDigits(), deletDigit().
1. generateRandomDigit(): Генерирует случайную цифру от 1 до 9. Использует функцию rand() из stdlib.h.
2. generateNumber(): Генерирует случайное число из N цифр, используя функцию generateRandomDigit().
Число формируется путем последовательного добавления случайных цифр, умножая каждую на соответствующую степень 10.
3. deletDigit(): Удаляет последнюю цифру числа.
4. countUniqueDigits(): Подсчитывает количество уникальных цифр в переданном числе.
Алгоритм использует битовую маску checkedDigits для отслеживания уже проверенных цифр.
Цифры извлекаются последовательно с помощью операций % 10 и /= 10.
Для каждой цифры подсчитывается количество её вхождений в числе.
Если количество вхождений равно 1, счётчик уникальных цифр увеличивается.
Основная функция main() инициализирует генератор случайных чисел, вызывает функции generateNumber() и countUniqueDigits(), а затем выводит результат с помощью printf().
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
// Функция для генерации случайной цифры от 1 до 9
int generateRandomDigit() {
int digit; // Переменная для хранения сгенерированной цифры
return digit;
}
// Функция для генерации случайного числа из N цифр
long long generateNumber() {
long long number = 0; // Сгенерированное число
long long multiplier = 1; // Множитель для построения числа
for (int i = 0; i < N; i++) { // Цикл по каждой цифре
int digit = generateRandomDigit(); // Генерируем случайную цифру
number += digit * multiplier; // Добавляем цифру к числу
multiplier *= 10; // Увеличиваем множитель для следующей цифры
}
return number;
}
// Функция для проверки уникальности цифры
int ifUniqueDigit(int digit, unsigned int checkedDigits) {
if ((checkedDigits & (1 << digit)) == 0) { // Проверяем, стречалась ли цифра младших разрядах
return 1; // Если не встречалась, счётчик уникальных цифр должен быть увеличен
}
return -1; // Если встречалась, счётчик должен быть уменьшен, поскольку цифра не уникальна
}
// Функция для подсчета количества уникальных цифр в числе
int countUniqueDigits(long long number) {
int uniqueCount = 0; // Количество уникальных цифр
unsigned int checkedDigits = 0; // Битовая маска для отслеживания проверенных цифр
for (int i = 0; i < N; i++) { // Цикл по каждой цифре числа
int digit = number % 10; // Извлекаем последнюю цифру
uniqueCount += ifUniqueDigit(digit, checkedDigits); // Проверяем цифру и изменяем значение счётчика
checkedDigits |= (1 << digit); // Добавляем проверенную цифру в маску
number /= 10; // Удаляем проверенную цифру
}
return uniqueCount;
}
int main() { // Инициализация генератора случайных чисел
long long number; // Сгенерированное число
int uniqueDigitsCount; // Количество уникальных цифр в сгенерированном числе
number = generateNumber();//Генерируем число
uniqueDigitsCount = countUniqueDigits(number); //Считаем уникальные цифры
printf("Сгенерированное число: %lld, количество уникальных цифр: %d\n", number
, uniqueDigitsCount
); // Вывод результата return 0;
}