Необходимо по заданному 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, заканчивая работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д