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