Найти сколько страниц в книге если известно количество цифр затраченных на нумерацию - 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
- } — конец программы