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

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

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

  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
Похожие ответы