Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Циклы: цифры, разворот числа и простота
Сложите цифры целого числа, разверните их порядок и классифицируйте результат.

Прочитайте положительное целое N. Найдите сумму цифр и постройте обратное число арифметически, без преобразования в строку. Определите, является ли результат простым, составным или ни тем ни другим для значений не больше единицы.
Выведите ровно три строки с метками Digit Sum:, Reversed: и Status:. Возможные статусы — Prime, Composite и Neither. Не переводите эти слова: они являются частью формата, который проверяют тесты.
Ввод
Одно положительное целое N.
Вывод
Digit Sum: <сумма> Reversed: <обратное число> Status: <Prime|Composite|Neither>
Ограничения
- 1 <= N <= 1 000 000 000
- Время: 1 секунда. Память: 64 МБ.
- Тип должен вмещать обратное число.
Подсказки
- Последнюю цифру даёт % 10, удалить её можно через / 10.
- Обновляйте reversed = reversed * 10 + digit.
- Достаточно проверять делители до квадратного корня результата.
Код C
#include <stdio.h>
#include <stdbool.h>
// Function to check if a number is prime
bool is_prime(int n) {
// TODO: Implement prime checking logic (O(sqrt(N)))
return false;
}
int main(void) {
int n;
if (scanf("%d", &n) != 1) {
return 1;
}
// TODO: 1. Calculate sum of digits
// TODO: 2. Reverse the integer N
// TODO: 3. Check if reversed integer is Prime
// Expected print format:
// printf("Digit Sum: %d\n", sum);
// printf("Reversed: %d\n", reversed);
// printf("Status: %s\n", is_prime(reversed) ? "Prime" : "Composite");
return 0;
}Открыть в компилятореРешение и объяснение
Обходите копию N, одновременно накапливая сумму и обратное число. Нули в конце исчезают при развороте целого: 100 превращается в 1.
Сначала обработайте значения меньше двух и делимость на два и три. Затем можно проверять кандидатов 6k - 1 и 6k + 1. Условие divisor <= n / divisor избегает переполнения квадрата.
Сложность O(log10(N) + sqrt(обратного числа)), дополнительная память O(1). Число 4321 составное: 29 × 149 = 4321.
Код решения
#include <stdio.h>
#include <stdbool.h>
bool is_prime(int n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) return false;
}
return true;
}
int main(void) {
int n;
if (scanf("%d", &n) != 1) {
return 1;
}
int temp = n;
int digit_sum = 0;
int reversed = 0;
// Loop through digits using modulo and integer division
while (temp > 0) {
int rem = temp % 10;
digit_sum += rem;
reversed = reversed * 10 + rem;
temp /= 10;
}
printf("Digit Sum: %d\n", digit_sum);
printf("Reversed: %d\n", reversed);
if (reversed <= 1) {
printf("Status: Neither\n");
} else if (is_prime(reversed)) {
printf("Status: Prime\n");
} else {
printf("Status: Composite\n");
}
return 0;
}Частые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.