Цифры данного числа n образуют строго возрастающую последовательность. Реши на языке C
Ответ нейросети
21 марта 2026 05:50
Задача звучит как: проверить, что цифры данного неотрицательного числа n в его обычном записи образуют строго возрастающую последовательность слева направо. То есть d1 < d2 < ... < dk, где n = d1d2...dk.
Пояснение к подходу (почему так работает):
- Если digits слева направо строго возрастают, то слева самая младшая цифра d1, затем d2 и т.д.
- Если мы читаем число справа налево (от наименьшей разрядности к наибольшей), получаем последовательность dk, dk-1, ..., d1, и она должна быть строго убывающей: dk > dk-1 > ... > d1.
- Поэтому можно проверить цифры справа налево: на каждом шаге сравнить текущую цифру c с предыдущей взятой цифрой last. Если c >= last — условие строгой возрастающей последовательности слева нарушено.
Алгоритм:
- Прочитать n как беззнаковое целое (unsigned long long). Это удобно и быстро для чисел до ~1.8e19.
- Если n имеет одну цифру или равен 0 — ответ YES.
- last = последняя цифра (n % 10); далее удаляем последнюю цифру и в цикле: cur = n % 10; если cur >= last, вернуть NO; иначе last = cur; продолжать.
- Если цикл завершился без нарушений — вернуть YES.
Код на C (на основе числового подхода):
#include <stdio.h>
int main() { unsigned long long n; if (scanf("%llu", &n) != 1) return 0;
int ok = 1;
int last = n % 10;
n /= 10;
while (n > 0) {
int cur = n % 10;
if (cur >= last) { // нарушено строгое возрастание слева
ok = 0;
break;
}
last = cur;
n /= 10;
}
printf("%s\n", ok ? "YES" : "NO");
return 0;
}
Пояснение к коду:
- Работает за O(number of digits) времени.
- Работает для любого n, который помещается в unsigned long long (до примерно 20 цифр).
Дополнительно: если число может иметь больше цифр, чем позволяет unsigned long long, можно решить аналогично с использованием строки. Ниже альтернативный вариант на строках (путь «для любых длин»):
#include <stdio.h> #include <string.h>
int main() { char s[10005]; if (scanf("%10004s", s) != 1) return 0;
int len = strlen(s);
int start = (s[0] == '-' || s[0] == '+') ? 1 : 0;
int ok = 1;
// пропускаем знак, затем сравниваем соседние цифры слева направо
for (int i = start + 1; i < len; ++i) {
// пропускаем нецифровые символы (на практике обычно их нет)
if (!(s[i-1] >= '0' && s[i-1] <= '9')) continue;
if (!(s[i] >= '0' && s[i] <= '9')) continue;
if (s[i] <= s[i-1]) {
ok = 0;
break;
}
}
printf("%s\n", ok ? "YES" : "NO");
return 0;
}
Если нужна помощь с выбором варианта в вашем задачнике (по формату вывода или constraints), скажите — адаптирую под конкретные требования.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



