Новая Школа - онлайн-школа подготовки к ЕГЭ
Программирование Задача №3588664
А
Аноним
21 марта 2026 05:50 · публичный вопрос
А
Аноним

цифры данного числа 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), скажите — адаптирую под конкретные требования.