Нумерация
Для нумерации m страниц книги использовали n цифр. По заданному n вывести m или 0, если решения не существует. Нумерация начинается с первой страницы.
Входные данные
Единственное число n. В книге не более 7000 страниц.
входные данные 27 . выходные 18
Выходные данные
Вывести количество страниц в книге.
C/C++
Нумерация.Программирование на С. Срочно
1..9 - по 1 цифре на страницу. Всего 9 цифр.
10..99 - по 2 цифры на страницу. Всего 180 цифр. Суммарно 189 цифр.
100..999 - по 3 цифры на страницу. Всего 2700 цифр. Суммарно 2889 цифр.
От 1000 - по 4 цифры на страницу.
if (n > 2889) printf("%d", (n -= 2889) % 4? 0: n / 4 + 999);
else if (n > 189) printf("%d", (n -= 189) % 3? 0: n / 3 + 99);
else if (n > 9) printf("%d", (n -= 9) % 2? 0: n / 2 + 9);
else printf("%d", n);
10..99 - по 2 цифры на страницу. Всего 180 цифр. Суммарно 189 цифр.
100..999 - по 3 цифры на страницу. Всего 2700 цифр. Суммарно 2889 цифр.
От 1000 - по 4 цифры на страницу.
if (n > 2889) printf("%d", (n -= 2889) % 4? 0: n / 4 + 999);
else if (n > 189) printf("%d", (n -= 189) % 3? 0: n / 3 + 99);
else if (n > 9) printf("%d", (n -= 9) % 2? 0: n / 2 + 9);
else printf("%d", n);
Руслан Хамбиков
Благодарю
#include < stdio.h >
int calc(int k){
int cnt = 0;
if(k >= 1000){
cnt += (k - 999) * 4;
k = 999;
}
if(k >= 100){
cnt += (k - 99) * 3;
k = 99;
}
if(k >= 10){
cnt += (k - 9) * 2;
k = 9;
}
return (cnt + k);
}
int main(){
int n, ans = 0, l = 1, r = 7000;
scanf("%d", &n);
while(l <= r && !ans){
int m = (l + r) / 2, curRes = calc(m);
if(curRes > n)
r = m - 1;
else if(curRes < n)
l = m + 1;
else
ans = m;
}
printf("%d", ans);
}
Идея: бинпоиск по ответу
Сложность: Θ(logMAXM)
Даже на сайт эту задачку залил и получил фулл поинты )

int calc(int k){
int cnt = 0;
if(k >= 1000){
cnt += (k - 999) * 4;
k = 999;
}
if(k >= 100){
cnt += (k - 99) * 3;
k = 99;
}
if(k >= 10){
cnt += (k - 9) * 2;
k = 9;
}
return (cnt + k);
}
int main(){
int n, ans = 0, l = 1, r = 7000;
scanf("%d", &n);
while(l <= r && !ans){
int m = (l + r) / 2, curRes = calc(m);
if(curRes > n)
r = m - 1;
else if(curRes < n)
l = m + 1;
else
ans = m;
}
printf("%d", ans);
}
Идея: бинпоиск по ответу
Сложность: Θ(logMAXM)
Даже на сайт эту задачку залил и получил фулл поинты )

А М
Смысл решать за O(log(n)), когда при заданных условиях задача решается за O(1)?
Похожие вопросы
- Программирование на C++ Срочно!!! очень надо
- Программирование на С++
- Программирование на C++
- Как начать изучать программирование?
- ПРОГРАММИРОВАНИЕ ПОМОГИТЕ СРОЧНО
- Программирование, с++, срочно
- Доброго дня! Хочу сменить сферу деятельности . Заинтересовал вариант программирования .
- Программирование на C++
- Книги по программированию.
- Может ли новичок в программирование начать с c++/Gamedev