Найти сколько страниц в книге если известно количество цифр затраченных на нумерацию - C (СИ)
Формулировка задачи:
Доброго времени суток. Решил простенькую задачку, но код получился очень громоздкий, сплошь из if-ов. Может быть существует более красивый способ решения задачки. Заранее спасибо за помощь. Текст задачи и свой код приложил.
Известно количество всех цифр, требуемых для нумерации книги (1<=N<=10 000). На первых трех страницах конспекта номера не стоят, а пронумерованные страницы начинаются с 4-й (при этом на 4-й стоит номер 4, на следующей 5 и т.д. Нужно найти сколько всего страниц было в книге. Гарантируется, что в подсчетах нет ошибки, и ответ всегда существует.
#include <stdio.h> int main() { int x,N; printf("Input number of digits\n"); scanf("%i",&N); if ((N<1)||(N>10000)) { //Input validation printf("Error"); } else { printf("Number of pages\n"); if (N<=6) { x=N+3; } else if (N<=186) { x=9+(N-6)/2; } else if (N<=2886) { x=99+(N-186)/3; } else if (N<=10000) { x=999+(N-2886)/4; } } printf("%d",x); //Output of pages return 0; }
Решение задачи: «Найти сколько страниц в книге если известно количество цифр затраченных на нумерацию»
textual
Листинг программы
#include <stdio.h> int mypow(int a, int b) { return (b == 0) ? 1 : a * mypow(a, b - 1); } int main() { int n, i, x, v; printf("Input number of digits: "); scanf("%i", &n); for (i = 1, n += 3, x = 0; 0 < n; ++i) { v = 9 * i * mypow(10, i - 1); x += (v < n) ? (v / i) : (n / i); n -= v; } printf("%d\n", x); return 0; }
Объяснение кода листинга программы
Вывод: Код считает количество страниц в книге, используя количество цифр в нумерации. Список:
- #include
— подключает файл стандартного ввода/вывода, необходимый для отправки сообщений в консоль - int mypow(int a, int b) { — определяет функцию с именем mypow, которая вычисляет степень числа a в степени b
- *return (b == 0) ? 1 : a mypow(a, b — 1);** — возвращает результат вычисления степени числа
- int main() { — определяет основную функцию программы
- printf(
Input number of digits:
); — выводит сообщение с просьбой ввести количество цифр в нумерации - scanf(
%i
, &n); — считывает введенное значение в переменную n - for (i = 1, n += 3, x = 0; 0 < n; ++i) { — начинает цикл, который выполняется до тех пор, пока n больше 0. Значение i используется как счетчик, x используется для хранения количества страниц, а n увеличивается на 3 после каждой итерации цикла
- v = 9 i mypow(10, i — 1); — вычисляет значение v, которое представляет собой количество цифр, использованных для нумерации текущей страницы
- x += (v < n) ? (v / i) : (n / i); — добавляет к x значение (v/i), если v меньше n, иначе добавляет (n/i). Это позволяет распределить оставшиеся страницы между страницами, которые уже были посчитаны
- n -= v; — уменьшает n на значение v, чтобы учесть, что эта страница уже была посчитана
- printf(
%d\n
, x); — выводит общее количество страниц - return 0; — завершает программу
- } — конец цикла
- } — конец функции main
- } — конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д