Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
1

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

07.02.2013, 20:49. Просмотров 2100. Ответов 17
Метки нет (Все метки)

Для нумерации M страниц книги использовали N цифр. По заданному N вывести M или 0, если решения не существует. Нумерация начинается с первой страницы.

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

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

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

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

Нумерация не с 0, а с 1
Как начать индексацию не с 0, а с 1? хэдэр: #ifndef LIST_H #define LIST_H ...

нумерация массива
как изменить нумерацию элементов одномерного массива...чтобы первому элементу...

Нумерация фигур №/N
Добрый вечер) Помогите с нумерацией не просто нумерацией 1,2,3,4 и тд. А...

Нумерация месяца
Доброго дня. Спорим с коллегой с какого числа начинать нумеровать месяца с 0...

Нумерация массива
Как провести нумерацию вектора и двумерного массива не с нуля а с единицы....

17
MrGrig
177 / 160 / 38
Регистрация: 08.10.2012
Сообщений: 423
07.02.2013, 21:17 2
Если честно, не совсем понятно задание. N имеется ввиду система счисления или как?
0
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
07.02.2013, 23:59  [ТС] 3
MrGrig, N - это количество цифр, из которых состоит число для страниц... То есть от 1 до 9 это 1 цифра, от 10 до 99, это 2 цифры, и так далее до 1001 страницы.
0
abit
272 / 271 / 83
Регистрация: 03.02.2013
Сообщений: 772
08.02.2013, 00:03 4
Цитата Сообщение от DarkDiablo Посмотреть сообщение
MrGrig, N - это количество цифр, из которых состоит число для страниц... То есть от 1 до 9 это 1 цифра, от 10 до 99, это 2 цифры, и так далее до 1001 страницы.
но тогда в вашем задании :
Пример входных данных: 27
это типа N?
27 цифр? и меньше 1001? круто... назовите такое число... 0000000..00001000 ?
0
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 страниц...
Это олимпиадная задача, естественно задание с заковыркой...
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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 минут
Единственное чего тут нет так это проверки на отрицательное значение и максимально кол. страниц, но думаю, это вовсе не проблема.
1
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 и у меня вышло посчитать, а вот обратно... Не догнал как))
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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?
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 неверно...
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
08.02.2013, 01:16 10
Просто нужно добавить ещё один цикл который проверяет ответ
0
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.
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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;
}
1
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 02:12  [ТС] 13
xtorne21st, Подправил, проверил, все считает правильно, но блин сайт на 40% принимает теперь)
Что-то тут не то... Не понятно...
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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% принимает теперь)
Не понятно
0
DarkDiablo
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 12
08.02.2013, 02:25  [ТС] 15
xtorne21st, А если попробовать вариант с паскаля переделать с помощью do while?
У меня правда, при этом, кучу непонятных цифр выдает...

Добавлено через 1 минуту
"Компактный" вариант, кстати, дальше 99 не считает уже...
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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, но по сути, роли не играет
1
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 так работает? То есть перед "?" - условие, а после ":" -иначе. Да?
0
xtorne21st
интересующийся
304 / 275 / 93
Регистрация: 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 минуты
Только вместо массива просто автоматическая переменная (чтобы упросить код)
0
08.02.2013, 13:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 13:43

Нумерация записей в файле
Добрый день! Скажите, пожалуйста, как сделать, чтобы нумерация записей в...

Тип enum и нумерация
Всем здрасьте ! У меня есть тип enum, который описывает что-то: enum NUM {...

Нумерация строк матрицы
Подскажите, пожалуйста, код, чтобы перед строками в матрицы выводился номер...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru