Необходимо по заданному 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.
Список действий:
- Ввод числа n с помощью функции
scanf
. - Функция
f
вызывается с аргументами n, 0 и массив m. - Если n больше 0, то функция
f
рекурсивно вызывается с аргументами n-1, результатом вызова функцииnext
с аргументами j и массив p и массив p. - Если n равно 0, то функция
f
возвращает 0. - Результат вызова функции
f
выводится на экран с помощью функцииprintf
. - Возвращается 0, заканчивая работу программы. Ниже представлен список действий с пронумерованными порядковыми номерами:
- Ввод числа n с помощью функции
scanf
. - Вызов функции
f
с аргументами n, 0 и массив m. - Если n больше 0:
a. Вызов функции
f
с аргументами n-1, результатом вызова функцииnext
с аргументами j и массив p и массив p. b. Если результат вызова функцииf
больше 0: i. Возврат результата вызова функцииf
. c. Иначе: i. Возврат 0. - Если n равно 0: a. Возврат 0.
- Вывод результата вызова функции
f
с помощью функцииprintf
. - Возвращение 0, заканчивая работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д