Необходимо по заданному N найти N-ое по счету число в получившейся последовательности - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вася записал ряд натуральных чисел в порядке возрастания: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 и т.д. Затем вычеркнул из него все числа, в которых имеется хотя бы две одинаковых цифры, и получил последовательность: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23 и т.д. Необходимо по заданному N найти N-ое по счету число в получившейся последовательности. Входные данные: В единственной строке входного файла записано натуральное число N (1 ≤ N ≤ 10000). Выходные данные: В единственную строку выходного файла нужно вывести N-ое по счету число без одинаковых цифр. Пример: Входные данные 100 Выходные данные 123 Я накидал ,но муторно получается
#include <stdio.h>
#include <stdlib.h>
 
int masfunc(int n);
 
int main()
{
    int n;
    scanf("%d", &n);
    if(n>=1 && n<=10000) {
        printf("%d", masfunc(n));
    }
    
    return 0;
}
 
int masfunc(int n)
{
    int s=n,i,j=0,mas[10000],k=10;
    for(i=1; i<=s; i++){
        if(i>10 && i<90 && 1==i%10) j++;
        if(i>90 && i<999) {
                if(i/100 == abs(k-i/10)) j++;
            }
        mas[i]=i+j;
    }
    return mas[s];
}

Решение задачи: «Необходимо по заданному N найти N-ое по счету число в получившейся последовательности»

textual
Листинг программы
#include <stdio.h>
 
void clear (int* b, int* e) {if (b<=e) {*b=0; clear(b+1, e);}}
void digits(int i, int* p) {if (i) {*(p+i%10)+=1; digits(i/10, p);}}
int test_digits(int* b, int* e) {return b>e ? 1 : *b<2 && test_digits(b+1, e);}
int test(int i, int* p) {clear(p, p+9); digits(i, p); return test_digits(p, p+9);}
int next(int i, int* p) {int j=i+1; return test(j, p) ? j : next(j, p);}
int f(int i, int j, int* p) {return i>0 ? f(i-1, next(j,p), p) : j;}
 
int main(void) {int n, m[10]; scanf("%d", &n); printf("%d", f(n, 0, m)); return 0;}

Объяснение кода листинга программы

В этом коде реализована функция f, которая вычисляет n-ое по счету число в последовательности, полученной из цифр числа n. Список действий:

  1. Ввод числа n с помощью функции scanf.
  2. Функция f вызывается с аргументами n, 0 и массив m.
  3. Если n больше 0, то функция f рекурсивно вызывается с аргументами n-1, результатом вызова функции next с аргументами j и массив p и массив p.
  4. Если n равно 0, то функция f возвращает 0.
  5. Результат вызова функции f выводится на экран с помощью функции printf.
  6. Возвращается 0, заканчивая работу программы. Ниже представлен список действий с пронумерованными порядковыми номерами:
  7. Ввод числа n с помощью функции scanf.
  8. Вызов функции f с аргументами n, 0 и массив m.
  9. Если n больше 0: a. Вызов функции f с аргументами n-1, результатом вызова функции next с аргументами j и массив p и массив p. b. Если результат вызова функции f больше 0: i. Возврат результата вызова функции f. c. Иначе: i. Возврат 0.
  10. Если n равно 0: a. Возврат 0.
  11. Вывод результата вызова функции f с помощью функции printf.
  12. Возвращение 0, заканчивая работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы