Форум программистов, компьютерный форум CyberForum.ru

Нумерация страниц - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
07.02.2013, 20:49     Нумерация страниц #1
Для нумерации M страниц книги использовали N цифр. По заданному N вывести M или 0, если решения не существует. Нумерация начинается с первой страницы.

Входные данные: Единственное число N. В книге не более 1001 страницы.

Выходные данные: Искомое количество страниц.

Пример входных данных: 27 Пример выходных данных: 18

Помогите решить пожалуйста, чтобы было не сильно замудрино...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 20:49     Нумерация страниц
Посмотрите здесь:

C++ нумерация массива
Нумерация массива C++
Нумерация месяца C++
нумерация элементов массива C++
C++ Нумерация фигур №/N
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
07.02.2013, 21:17     Нумерация страниц #2
Если честно, не совсем понятно задание. N имеется ввиду система счисления или как?
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
07.02.2013, 23:59  [ТС]     Нумерация страниц #3
MrGrig, N - это количество цифр, из которых состоит число для страниц... То есть от 1 до 9 это 1 цифра, от 10 до 99, это 2 цифры, и так далее до 1001 страницы.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
08.02.2013, 00:03     Нумерация страниц #4
Цитата Сообщение от DarkDiablo Посмотреть сообщение
MrGrig, N - это количество цифр, из которых состоит число для страниц... То есть от 1 до 9 это 1 цифра, от 10 до 99, это 2 цифры, и так далее до 1001 страницы.
но тогда в вашем задании :
Пример входных данных: 27
это типа N?
27 цифр? и меньше 1001? круто... назовите такое число... 0000000..00001000 ?
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 00:30  [ТС]     Нумерация страниц #5
abit, Для 18 страниц нужно 27 цифр, все верно. Я имел ввиду что любое число от 10 до 99 имеет 2 цифры, а от 100 до 999 - 3 цифры. Что тут непонятного?
1+1+1+1+1+1+1+1+1+2+2+2+2+2+2+2+2+2 = 27 цифр, которые используются для 18 страниц...
Это олимпиадная задача, естественно задание с заковыркой...
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 00:39     Нумерация страниц #6
Вроде правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main()
{
    int M;
    std::cout << "Enter M: ";
    std::cin >> M;
        
    int N = 0;
    int a = 0;
    for (int x = M; x >= 1; x -= a) {
        a = 0;
        for (int j = x; j; j /= 10)
            ++a;
        ++N;
    }
    std::cout << "N = " << N << '\n';
 
    return 0;
}
Зы из M в N посчитать полегче будет)

Добавлено через 5 минут
Единственное чего тут нет так это проверки на отрицательное значение и максимально кол. страниц, но думаю, это вовсе не проблема.
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 00:47  [ТС]     Нумерация страниц #7
xtorne21st, На 33,3% проходит, считает правильно, но если вводишь например 12 либо 14, то ответ будет неправильным, так как для 10 страниц нужно 11 цифр, а для 11 страниц - 13 цифр. В каждом таком неверном случае должно выводиться 0.

Добавлено через 1 минуту
Из M в N и у меня вышло посчитать, а вот обратно... Не догнал как))
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 00:56     Нумерация страниц #8
Цитата Сообщение от DarkDiablo Посмотреть сообщение
xtorne21st, На 33,3% проходит, считает правильно, но если вводишь например 12 либо 14, то ответ будет неправильным, так как для 10 страниц нужно 11 цифр, а для 11 страниц - 13 цифр. В каждом таком неверном случае должно выводиться 0.
Либо условие оформлено "не верно" либо я чего-то не догоняю)). Т.е. получается результат будет "верно" только если нумерация страниц от 1 до 9? Ведь если больше, то будет "не верно"?)))

Добавлено через 1 минуту
Т.е. не совсем понятно для каких ситуаций нужно применять "0".

Добавлено через 2 минуты
У меня всё првильно выходит: вводишь M = 11, получаешь N = 10; вводишь M = 13, получашь N = 11. Для каких случаев нужен 0?
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 01:14  [ТС]     Нумерация страниц #9
xtorne21st, Давай разберем по-порядку)
1 -1 цифра, 2 - 1 цифра, 3,4,5,6,7,8,9 - тоже одна цифра
10, 11, 12 и так далее - 2 цифры.
Допустим нам надо пронумировать 14 страниц, значит нам понадобится для этого
1+1+1+1+1+1+1+1+1+2+2+2 = 15 символов. Но если мы введем, к примеру, 14 символов - то нам не хватит 1 символа для еще одной страницы, это и есть неправильный вариант, в котором нужно вывести 0. И так для всех вариантов. Как я понял, в интервале от 9 до 99, начиная с цифры 12, все дальнейшие четные цифры неверные...
Но в случае с 3 цифрами, последовательность поменяется... (По напридумывают блин задач...)

Добавлено через 11 минут
Даже, начиная с 10...
9 верно, 10 неверно, 11 верно, 12 неверно, 13 верно, 14 неверно...
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 01:16     Нумерация страниц #10
Просто нужно добавить ещё один цикл который проверяет ответ
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 01:31  [ТС]     Нумерация страниц #11
Эта программа есть на паскале, но у меня не выходит ее правильно переделать.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
n,m,t,kol:integer;
begin
readln(n);
repeat
inc(m);
t:=m;
 repeat
  t:=t div 10;
  inc(kol);
 until t=0;
until kol>=n;
if kol=n then writeln(m)else writeln(0);
end.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 01:54     Нумерация страниц #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
int main()
{
    int M;
    std::cout << "Enter M: ";
    std::cin >> M;
        
    int N = 0;
    int a = 0;
    for (int x = M; x >= 1; x -= a) {
        a = 0;
        for (int j = x; j; j /= 10)
            ++a;
        ++N;
    }
 
    int res = 0;
    for (int x = 1; res < M; ++x) {
        a = 0;
        for (int j = x; j; j /= 10)
            ++a;
        res += 1 * a; 
        if (res == M) {
            std::cout << "N = " << N << std::endl;
            return 0;
        }
    }
 
    std::cout << "Error\n";
 
    return 0;
}
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 02:12  [ТС]     Нумерация страниц #13
xtorne21st, Подправил, проверил, все считает правильно, но блин сайт на 40% принимает теперь)
Что-то тут не то... Не понятно...
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 02:19     Нумерация страниц #14
Или чуть более "компактней":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
int N, M, a, b, res;
 
int main()
{
    std::cout << "Enter M: ";
    std::cin >> M;
        
    for (int x = M, f = 1; x >= 1; x -= a, ++f) {
        a = b = 0;
        for (int j = x; j; j /= 10)
            ++a;
        for (int j = f; j; j /= 10)
            ++b;
        ++N;
        res += 1*b;
    }
    (res == M) ? (std::cout << "N = " << N << std::endl) :
        (std::cout << "Error.\n");
 
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от DarkDiablo Посмотреть сообщение
но блин сайт на 40% принимает теперь)
Не понятно
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 02:25  [ТС]     Нумерация страниц #15
xtorne21st, А если попробовать вариант с паскаля переделать с помощью do while?
У меня правда, при этом, кучу непонятных цифр выдает...

Добавлено через 1 минуту
"Компактный" вариант, кстати, дальше 99 не считает уже...
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 02:57     Нумерация страниц #16
На паскале один внешний цикл и одни вложенный, у нас получилось 1 внешний и 2 вложенных: нужен другой алгоритм)

Добавлено через 12 минут
Цитата Сообщение от DarkDiablo Посмотреть сообщение
"Компактный" вариант, кстати, дальше 99 не считает уже...
Да, действительно, это из-за не правильно условия основоного цикла for, пробуйте заменить x >= 1 на res < M

Добавлено через 2 минуты
Цитата Сообщение от DarkDiablo Посмотреть сообщение
do while
do while от while не слишком и отличается, если даже переделать, то результат, мне кажется, не особото и изменится

Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
int N, M, a, b, res;
 
int main()
{
    std::cout << "Enter M: ";
    std::cin >> M;
        
    for (int x = M, f = 1; res < M; x -= a, ++f) {
        a = b = 0;
        for (int j = x; j; j /= 10)
            ++a;
        for (int j = f; j; j /= 10)
            ++b;
        ++N;
        res += 1*b;
    }
    (res == M) ? (std::cout << "N = " << N << std::endl) :
        (std::cout << "Error.\n");
 
    return 0;
}
Добавлено через 4 минуты
Только щас заметил, что мы перепутали по условию M и N, но по сути, роли не играет
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 13:29  [ТС]     Нумерация страниц #17
xtorne21st, Последний вариант-таки прошел!!! Спасибо большое! =)
Только можете немного объяснить работу программы построчно?) А то я циклами в таком порядке не пользовался, не все понятно...
И
C++
1
2
(res == M) ? (std::cout << "N = " << N << std::endl) :
        (std::cout << "Error.\n");
это вместо обычного if так работает? То есть перед "?" - условие, а после ":" -иначе. Да?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 13:43     Нумерация страниц
Еще ссылки по теме:

Нумерация строк матрицы C++
C++ Нумерация не с 0, а с 1
C++ Нумерация записей в файле

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 13:43     Нумерация страниц #18
Абсолютно верно, это замена if else. Только более понятно вот примеры на эту тему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <ctime>
#include <cstdlib>
 
int main()
{
    int a = 5, b = 8;
    int max = (a > b) ? a : b; // скобки не обязательно
 
    (b > a) ? max = b : max = a;
 
    // вывод массива по 10 символов в строке
    srand(time(0)); // псевдорандомное начальное значения для rand()
    for (int i = 0, val, SIZE = 100; i < SIZE; ++i) {
        std::cout << (val = rand() % 100); // не больше 99
        (i % 10 == 9) ? (std::cout << '\n') : (std::cout << ' ');
    }
 
    return 0;
}
Добавлено через 2 минуты
Только вместо массива просто автоматическая переменная (чтобы упросить код)
Yandex
Объявления
08.02.2013, 13:43     Нумерация страниц
Ответ Создать тему
Опции темы

Текущее время: 17:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru