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

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

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. void clear (int* b, int* e) {if (b<=e) {*b=0; clear(b+1, e);}}
  4. void digits(int i, int* p) {if (i) {*(p+i%10)+=1; digits(i/10, p);}}
  5. int test_digits(int* b, int* e) {return b>e ? 1 : *b<2 && test_digits(b+1, e);}
  6. int test(int i, int* p) {clear(p, p+9); digits(i, p); return test_digits(p, p+9);}
  7. int next(int i, int* p) {int j=i+1; return test(j, p) ? j : next(j, p);}
  8. int f(int i, int j, int* p) {return i>0 ? f(i-1, next(j,p), p) : j;}
  9.  
  10. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы