Матч 37, Нумерация книг (BooksNumbering)

 

Книги в библиотеке перенумерованы натуральными числами: 1, 2, 3, … . Для нумерации было использовано usedDigits цифр. По значению usedDigits необходимо вычислить количество книг в библиотеке. Если такой нумерации не существует, вернуть -1.

 

Класс: BooksNumbering

Метод: int numberOfBooks(int usedDigits)

Ограничения: 1 £ usedDigits £ 2*109.

 

Вход. Количество цифр usedDigits, использованное при нумерации книг библиотеки.

 

Выход. Количество книг в библиотеке. Если нумерации не существует, вернуть -1.

 

Пример входа

usedDigits

11

1863927342

1863927343

 

Пример выхода

10

219448716

-1

 

 

РЕШЕНИЕ

математика

 

Однозначных натуральных чисел имеется 9, двузначных 90, трехзначных 900 и так далее. В переменной b будем хранить количество c - значных чисел. Изначально положим b = 9, c = 1, на каждой итерации b будем умножать на 10, а к c будем прибавлять 1. Из usedDigits на каждой итерации будем вычитать количество цифр, необходимое для записи всех c - значных чисел. Когда usedDigits станет не больше b * c, то все c - значные числа записать не удастся. Оставшимися usedDigits цифрами можно будет записать только (usedDigits / c) c - значных чисел. Если usedDigits не делится нацело на c, то возвращаем -1. В переменной u накапливаем количество использованных цифр при нумерации.

 

ПРОГРАММА

 

#include <stdio.h>

 

class BooksNumbering

{

public:

  int numberOfBooks(int usedDigits)

  {

    long long b = 9, c = 1, u = 0;

    while(usedDigits > b * c)

    {

      usedDigits -= b * c; u += b;

      b *= 10; c++;

    }

    if(usedDigits % c != 0)  return -1;

    return u + usedDigits / c;

  }

};