Давайте вместе разберем задачу и создадим необходимые функции на языке C++, а также решим поставленную задачу.
Пояснение условий задачи:
Нам нужно реализовать три функции:
bool IsCorrect(int n1, int n2) — определить, является ли интервал корректным. Обычно интервал корректен, если n1 <= n2.
bool IsSimple(int n) — проверить, является ли число простым.
bool HasRep(int n) — проверить, содержит ли число хотя бы две одинаковые цифры.
После этого нужно посчитать, сколько чисел-простей на интервале [a, b], содержат одинаковые цифры.
Шаг 1: Реализация функции IsCorrect
Эта функция проверяет, что интервал корректен:
bool IsCorrect(int n1, int n2) {
return n1 <= n2;
}
Шаг 2: Реализация функции IsSimple
Проверим, является ли число простым:
#include <cmath>
bool IsSimple(int n) {
if (n < 2) return false; // 0 и 1 не являются простыми
int sqrtN = static_cast<int>(sqrt(n));
for (int i = 2; i <= sqrtN; ++i) {
if (n % i == 0)
return false;
}
return true;
}
Шаг 3: Реализация функции HasRep
Проверим, есть ли хотя бы две одинаковые цифры:
#include <set>
bool HasRep(int n) {
std::set<int> digits;
while (n > 0) {
int digit = n % 10;
if (digits.count(digit))
return true; // нашли повтор
digits.insert(digit);
n /= 10;
}
return false;
}
Обработка числа 0: поскольку 0 — это число, у него одна цифра, повторов не будет, это корректно работает.
Шаг 4: Основная часть программы
Объявим интервал [a, b], и для каждого числа в диапазоне будем проверять условия: число простое и содержит повторяющиеся цифры. Подсчитываем количество таких чисел.
#include <iostream>
int main() {
int a, b;
std::cout << "Введите интервал [a, b]: ";
std::cin >> a >> b;
if (!IsCorrect(a, b)) {
std::cout << "Некорректный интервал." << std::endl;
return 1;
}
int count = 0;
for (int num = a; num <= b; ++num) {
if (IsSimple(num) && HasRep(num))
++count;
}
std::cout << "Количество простых чисел на интервале [" << a << ", " << b << "] с одинаковыми цифрами: " << count << std::endl;
return 0;
}
Итог: полный пример кода
#include <iostream>
#include <cmath>
#include <set>
bool IsCorrect(int n1, int n2) {
return n1 <= n2;
}
bool IsSimple(int n) {
if (n < 2) return false;
int sqrtN = static_cast<int>(sqrt(n));
for (int i = 2; i <= sqrtN; ++i) {
if (n % i == 0)
return false;
}
return true;
}
bool HasRep(int n) {
std::set<int> digits;
if (n == 0) return false; // число 0 не имеет повторов
while (n > 0) {
int digit = n % 10;
if (digits.count(digit))
return true;
digits.insert(digit);
n /= 10;
}
return false;
}
int main() {
int a, b;
std::cout << "Введите интервал [a, b]: ";
std::cin >> a >> b;
if (!IsCorrect(a, b)) {
std::cout << "Некорректный интервал." << std::endl;
return 1;
}
int count = 0;
for (int num = a; num <= b; ++num) {
if (IsSimple(num) && HasRep(num))
++count;
}
std::cout << "Количество простых чисел на интервале [" << a << ", " << b << "] с одинаковыми цифрами: " << count << std::endl;
return 0;
}
Если есть дополнительные вопросы или нужно что-то уточнить — обращайтесь!