Найти сколько страниц в книге если известно количество цифр затраченных на нумерацию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Решил простенькую задачку, но код получился очень громоздкий, сплошь из if-ов. Может быть существует более красивый способ решения задачки. Заранее спасибо за помощь. Текст задачи и свой код приложил. Известно количество всех цифр, требуемых для нумерации книги (1<=N<=10 000). На первых трех страницах конспекта номера не стоят, а пронумерованные страницы начинаются с 4-й (при этом на 4-й стоит номер 4, на следующей 5 и т.д. Нужно найти сколько всего страниц было в книге. Гарантируется, что в подсчетах нет ошибки, и ответ всегда существует.
Листинг программы
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int x,N;
  5. printf("Input number of digits\n");
  6. scanf("%i",&N);
  7. if ((N<1)||(N>10000)) { //Input validation
  8. printf("Error");
  9. }
  10. else {
  11. printf("Number of pages\n");
  12. if (N<=6) {
  13. x=N+3;
  14. }
  15. else if (N<=186) {
  16. x=9+(N-6)/2;
  17. }
  18. else if (N<=2886) {
  19. x=99+(N-186)/3;
  20. }
  21. else if (N<=10000) {
  22. x=999+(N-2886)/4;
  23. }
  24. }
  25. printf("%d",x); //Output of pages
  26. return 0;
  27. }

Решение задачи: «Найти сколько страниц в книге если известно количество цифр затраченных на нумерацию»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. int mypow(int a, int b) {
  4.     return (b == 0) ? 1 : a * mypow(a, b - 1);
  5. }
  6.  
  7. int main() {
  8.     int n, i, x, v;
  9.  
  10.     printf("Input number of digits: ");
  11.     scanf("%i", &n);
  12.  
  13.     for (i = 1, n += 3, x = 0; 0 < n; ++i) {
  14.         v = 9 * i * mypow(10, i - 1);
  15.         x += (v < n) ? (v / i) : (n / i);
  16.         n -= v;
  17.     }
  18.  
  19.     printf("%d\n", x);
  20.  
  21.     return 0;
  22. }

Объяснение кода листинга программы

Вывод: Код считает количество страниц в книге, используя количество цифр в нумерации. Список:

  1. #include — подключает файл стандартного ввода/вывода, необходимый для отправки сообщений в консоль
  2. int mypow(int a, int b) { — определяет функцию с именем mypow, которая вычисляет степень числа a в степени b
  3. *return (b == 0) ? 1 : a mypow(a, b — 1);** — возвращает результат вычисления степени числа
  4. int main() { — определяет основную функцию программы
  5. printf(Input number of digits:); — выводит сообщение с просьбой ввести количество цифр в нумерации
  6. scanf(%i, &n); — считывает введенное значение в переменную n
  7. for (i = 1, n += 3, x = 0; 0 < n; ++i) { — начинает цикл, который выполняется до тех пор, пока n больше 0. Значение i используется как счетчик, x используется для хранения количества страниц, а n увеличивается на 3 после каждой итерации цикла
  8. v = 9 i mypow(10, i — 1); — вычисляет значение v, которое представляет собой количество цифр, использованных для нумерации текущей страницы
  9. x += (v < n) ? (v / i) : (n / i); — добавляет к x значение (v/i), если v меньше n, иначе добавляет (n/i). Это позволяет распределить оставшиеся страницы между страницами, которые уже были посчитаны
  10. n -= v; — уменьшает n на значение v, чтобы учесть, что эта страница уже была посчитана
  11. printf(%d\n, x); — выводит общее количество страниц
  12. return 0; — завершает программу
  13. } — конец цикла
  14. } — конец функции main
  15. } — конец программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы