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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 2744, средняя оценка - 4.89
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
#1

Задачи для тренировки и лучшего понимания - C++

15.07.2010, 05:53. Просмотров 338594. Ответов 1272
Метки нет (Все метки)

Ребят. Кто-нибудь может дать задачу для тренировки? Приблизительно по всему курсу С++. Буду благодарен за сложную задачу, но которую способен сделать новичок-любитель. Затраты сил-времени не важно. Главное, чтобы это было интересно и не слишком рутинно. + Если найдется человек который даст задачу просьба помогать с кодом, который я буду себя скидывать. Не переписывать за меня, но указывать на ошибки и желательно объяснять. Заранее спасибо.

Список задач, решение которых присутствует в данной теме:
Лучшие ответы (59)
Сообщение: #857841 Сообщение: #857861 Сообщение: #858352 Сообщение: #859371 Сообщение: #860160 Сообщение: #860255 Сообщение: #860259 Сообщение: #860317 Сообщение: #860368 Сообщение: #860466 Сообщение: #860508 Сообщение: #860720 Сообщение: #861091 Сообщение: #862174 Сообщение: #862617 Сообщение: #867259 Сообщение: #870298 Сообщение: #872053 Сообщение: #876456 Сообщение: #880114 Сообщение: #882889 Сообщение: #884418 Сообщение: #886414 Сообщение: #886989 Сообщение: #887733 Сообщение: #888464 Сообщение: #888487 Сообщение: #888941 Сообщение: #888947 Сообщение: #889040 Сообщение: #889450 Сообщение: #889587 Сообщение: #891772 Сообщение: #891790 Сообщение: #891862 Сообщение: #897758 Сообщение: #897782 Сообщение: #906325 Сообщение: #907991 Сообщение: #943672 Сообщение: #943700 Сообщение: #967735 Сообщение: #1053777 Сообщение: #1054209 Сообщение: #1083853 Сообщение: #1083928 Сообщение: #1131058 Сообщение: #1131359 Сообщение: #1273743 Сообщение: #1275465 Сообщение: #1276743 Сообщение: #1279215 Сообщение: #1282583 Сообщение: #1309088 Сообщение: #1315633 Сообщение: #1366395 Сообщение: #1550164 Сообщение: #1603678 Сообщение: #1604364
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53     Задачи для тренировки и лучшего понимания
Посмотрите здесь:

C++ Какой компилятор выбрать для лучшего изучения С++ по книге Берна Страуструпа?п
C++ Элементарные программы, для лучшего понимания языка...
Нужны задачи для тренировки C++
C++ Киньте задачки для тренировки
C++ Нужны простые задачи для тренировки
Нужны задачи для тренировки C++
На соревнованиях по фигурному катанию оценки заносятся в компьютер. Составить программу для вывода на экран лучшего результата после каждого выступлен C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 16:09     Задачи для тренировки и лучшего понимания #1021
Mr.X, Ваш код прошел все тесты.

Добавлено через 3 часа 39 минут
Теперь разбор задачи "Бутылки".
Я для примера буду использовать входные данные из примера к задаче: вход:7 3, выход: 83
Пройдем пути всех закупок от первого и до последнего дня:
1 день:
Имеющаяся сумма - 83
83/7=11 - кол-во полных купленных бутылок
сдача - 6
2 день:
Имеющаяся сумма - 11*3+6=39
39/7=5 - кол-во полных купленных бутылок
сдача - 4
3 день:
Имеющаяся сумма - 5*3+4=19
19/7=2 - кол-во полных купленных бутылок
сдача - 5
4 день:
Имеющаяся сумма - 2*3+5=11
11/7=1 - кол-во полных купленных бутылок
сдача - 4
5 день:
Имеющаяся сумма - 1*3+4=7
7/7=1 - кол-во полных купленных бутылок
сдача - 0
Решать задачу начинаем естественно с 5 дня и продвигаясь к первому дню.
Для любого текущего дня нам известно: Сдача, полученная в этот день (для 5-го дня равна 0), Сумма до покупки (для 5-го дня равна P).
Из данных любого дня можно узнать сколько полных бутылок было куплено в предыдущий день:
(Общее количество денег перед покупкой текущего дня - S).
Это значение равно: (S-P)/F+1.
Для примера смотрим 3-ий день Имеющаяся сумма: 5*3+4=19 (вот эту пятерку и нужно найти, число 4 нам тоже неизвестно - это сдача не текущего дня, а предыдущего, нам известно, только 19 (это S)и 3 (это F)). Еще раз повторюсь:
Для любого текущего дня нам известно: Сдача полученная после покупки в этот день, Сумма до покупки.
Помним что сдача предыдущего дня не может превышать P, поэтому и получается: (19-7)/3+1=5. или (S-P)/F+1.
Вычислив сколько бутылок было куплено в предыдущий день мы можем найти сдачу предыдущего дня: опять смотрим пример для 3-го дня:
5*3+4=19
19 известно
3 известно
5 только что вычислили
Нужно найти 4.
Т.е. формула получается уже такая: S-((S-P)/F+1)*F - сдача предыдущего дня.
Далее можно найти сумму денег предыдущего дня до покупки, но после сдачи бутылок (полную имеющуюся сумму): Сдача+Количество купленных бутылок * P
Итак получаем: S-((S-P)/F+1)*F+((S-P)/F+1)*P
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 16:09     Задачи для тренировки и лучшего понимания #1022
Шахматная доска
(Время: 1 сек. Память: 16 Мб Сложность: 36%)

Из шахматной доски по границам клеток выпилили связную (не распадающуюся на части) фигуру без дыр. Требуется определить ее периметр.
Входные данные

Во входном файле INPUT.TXT сначала записано число N (1 ≤ N ≤ 64) – количество выпиленных клеток. В следующих N строках указаны координаты выпиленных клеток, разделенные пробелом (номер строки и столбца – числа от 1 до 8). Каждая выпиленная клетка указывается один раз.
Выходные данные

В выходной файл OUTPUT.TXT выведите одно число – периметр выпиленной фигуры (сторона клетки равна единице).
Примеры:
INPUT.TXT
3
1 1
1 2
2 1
OUTPUT.TXT
8

Следующий пример:
INPUT.TXT

1
8 8
OUTPUT.TXT
4
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
11.01.2011, 17:06     Задачи для тренировки и лучшего понимания #1023
valeriikozlov, эх... Самое, что ни на есть, лобовое решение)))

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <fstream>
 
int main()
{
    int board[10][10] = {0};
 
    std::ifstream input("input.txt");
 
    int n;
    int x, y;
 
    input >> n;
 
    for (int i = 0; i < n; ++i)
    {
        input >> x >> y;
 
        board[x][y] = 1;
    }
 
    input.close();
 
    int p = 0;
 
    for (int i = 1; i < 9; ++i)
    {
        for (int j = 1; j < 9; ++j)
        {
            if (board[i][j] == 1)
            {
                if (board[i - 1][j] == 0)
                    ++p;
 
                if (board[i][j + 1] == 0)
                    ++p;
 
                if (board[i + 1][j] == 0)
                    ++p;
 
                if (board[i][j - 1] == 0)
                    ++p;
            }
        }
    }
 
    std::ofstream output("output.txt");
 
    output << p;
 
    output.close();
 
    return 0;
}
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 17:09     Задачи для тренировки и лучшего понимания #1024
silent_1991, Все тесты Ваш код прошел.
asics
Freelance
Эксперт C++
2842 / 1779 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
11.01.2011, 17:10     Задачи для тренировки и лучшего понимания #1025
valeriikozlov, Проверяйте
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <vector>
#include <fstream>
 
struct _point
{
    int x,
    y;
};
 
int main()
{
    std::ifstream ifs("input.txt");
    std::vector<_point> point;
    int cnt_points;
 
    ifs >> cnt_points;
    point.resize(cnt_points);
 
    for(int i = 0; i < cnt_points; ++i)
    {
        ifs >> point[i].x;
        ifs >> point[i].y;
    }
 
    const size_t m_sz = 8;
    int matr[m_sz][m_sz] =
    {
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
        {1, 1, 1, 1, 1, 1, 1, 1}
    };
 
    for(int i = 0; i < m_sz; ++i)
         for(int j = 0; j < m_sz; ++j)
             for(int k = 0; k < point.size(); ++k)
                 if(i == point[k].x - 1 && j == point[k].y - 1)
                     matr[i][j] = 0;
 
    size_t per = cnt_points * 4;
    for(int i = 0; i < m_sz; ++i)
    {
         for(int j = 0; j < m_sz; ++j)
         {
             if(!matr[i][j])
             {
                     if(i - 1 >= 0)
                     {
                          if(!matr[i - 1][j])
                             --per;
                      }
 
                        if(j + 1 < m_sz)
                        {
                             if(!matr[i][j + 1])
                                 --per;
                        }
 
                         if(i + 1 < m_sz)
                         {
                              if(!matr[i + 1][j])
                                 --per;
                         }
 
                         if(j - 1 >= 0)
                         {
                               if(!matr[i][j - 1])
                                  --per;
                         }
                 }
             }
         }
 
    std::ofstream ofs("uotput.txt");
    ofs << per;
 
    return 0;
}
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
11.01.2011, 17:12     Задачи для тренировки и лучшего понимания #1026

Не по теме:

valeriikozlov, да задачка-то простенькая))



Добавлено через 1 минуту

Не по теме:

asics, интересно... ваше решение - прямо зеркальное отражение моего! Всё наоборот делается))) Мистика))

asics
11.01.2011, 17:15
  #1027

Не по теме:

silent_1991, До чего додумался, то и изложил , чувствую набыдлокодил)

silent_1991
11.01.2011, 17:18
  #1028

Не по теме:

asics, не, я имею ввиду, что я массив нулями забиваю, вы единицами, периметр я ищу, проверяя занятые клетки и при попадании увеличивая периметры, вы наоборот, смотрите свободные клетки и периметр уменьшаете)))

valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 17:18     Задачи для тренировки и лучшего понимания #1029
asics, Тоже все тесты Ваш код прошел. (Была заминка только с:
C++
1
std::ofstream ofs("uotput.txt");
) Чуть неправильно название файла указали.
asics
Freelance
Эксперт C++
2842 / 1779 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
11.01.2011, 17:21     Задачи для тренировки и лучшего понимания #1030

Не по теме:

З инглишом всегда на Вы был


Интиресно, возможно ли решить эту задачу не используя двумерные масивы
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 19:11     Задачи для тренировки и лучшего понимания #1031
Произведение цифр
(Время: 1 сек. Память: 16 Мб Сложность: 42%)

Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N.
Входные данные

В единственной строке входного файла INPUT.TXT записано одно целое число N (0 ≤ N ≤ 109).
Выходные данные

В выходной файл OUTPUT.TXT нужно вывести искомое число Q. В том случае, если такого числа не существует, следует вывести -1.
Примеры:
INPUT.TXT
10
OUTPUT.TXT
25

Следующий пример:
INPUT.TXT
13
OUTPUT.TXT
-1

Следующий пример:
INPUT.TXT
90
OUTPUT.TXT
259
asics
Freelance
Эксперт C++
2842 / 1779 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
11.01.2011, 19:46     Задачи для тренировки и лучшего понимания #1032
valeriikozlov, Тупой перебор(до большего не додумался)
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
34
35
36
#include <iostream>
#include <fstream>
#include <string>
#include <limits>
 
int get_mul_digits(int n)
{
    int res = 1;
    while(n)
    {
        res *= n % 10;
        n /= 10;
    }
 
    return res;
}
 
int main()
{
    std::ifstream ifs("input.txt");
 
    int N, Q = std::numeric_limits<int>::max();
    ifs >> N;
 
    for(int i = 10; i < 999999; ++i)
        if(get_mul_digits(i) == N && i < Q)
            Q = i;
 
    std::ofstream ofs("output.txt");
    if(Q == std::numeric_limits<int>::max())
        ofs << -1;
 
    else
        ofs << Q;
    return 0;
}
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
11.01.2011, 19:55     Задачи для тренировки и лучшего понимания #1033
Хм... что-то не особо уверен...

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <fstream>
 
int main()
{
    std::ifstream input("C:\\Users\\silent\\Desktop\\input.txt");
 
    int number;
    char result[8];
    int len = 0;
 
    input >> number;
 
    input.close();
 
    for (int div = 9; div >= 2; --div)
    {
        while (number % div == 0)
        {
            if (number == 1)
            {
                div = 1;
 
                break;
            }
 
            result[len++] = div + '0';
            number /= div;
        }
    }
 
    std::ofstream output("C:\\Users\\silent\\Desktop\\output.txt");
 
    if (len == 0)
        output << -1;
    else
    {
        char temp;
 
        for (int i = 0; i < len; ++i)
        {
            for (int j = len - 1; j > i; --j)
            {
                if (result[j - 1] > result[j])
                {
                    temp = result[j - 1];
                    result[j - 1] = result[j];
                    result[j] = temp;
                }
            }
        }
 
        result[len] = '\0';
 
        output << result;
    }
 
    return 0;
}
Добавлено через 35 секунд
А, не, стоп. Забыл -1 вывести. Сейчас поправлю.

Добавлено через 2 минуты
Всё, можно юзать)))
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 20:06     Задачи для тренировки и лучшего понимания #1034
asics, Не проходит 6-ой тест. Чуть-чуть укажу направление:
C++
1
2
3
  for(int i = 10; i < 999999; ++i)
        if(get_mul_digits(i) == N && i < Q)
            Q = i;
Почему начинаем с i=10 ?
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
11.01.2011, 20:08     Задачи для тренировки и лучшего понимания #1035
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 <fstream>
#include <cmath>
#include <vector>
 
using namespace std;
 
ifstream cin("input.txt");
ofstream cout("output.txt");
 
int main()
{   
    int n;
    cin >> n;
    vector<int> ans;
           if(n == 0)
                       cout << 10;
           else if(n <= 9)
        cout << n;
    else
    {
        for(int i = 9; i >= 2; i--)
            while(n % i == 0)
            {
                ans.push_back(i);
                n /= i;
            }
        if(n != 1)
            cout << -1;
        else
            for(int i = ans.size()-1; i >= 0; i--)
                cout << ans[i];
    }
}
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
11.01.2011, 20:13     Задачи для тренировки и лучшего понимания #1036
valeriikozlov, а у меня как?
asics
Freelance
Эксперт C++
2842 / 1779 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
11.01.2011, 20:13     Задачи для тренировки и лучшего понимания #1037
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Почему начинаем с i=10 ?
Хм, а что с нуля разве ?
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 20:14     Задачи для тренировки и лучшего понимания #1038
silent_1991, Ваш код превышает установленное время на 4-ом тесте (это бывает когда цикл не заканчивается).
Сейчас повнимательней еще посмотрю. А алгоритм используете такой же как и я использовал.
silent_1991
11.01.2011, 20:14
  #1039

Не по теме:

asics, с 9

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2011, 20:14     Задачи для тренировки и лучшего понимания
Еще ссылки по теме:

C++ Какая база требуется для понимания C++?
C++ Нужен пример рекурсивной функции для понимания ее назначения и практической пользы
C++ Builder Прошу примеров для понимания INDY
Книги для тренировки/развития котелка и просто убийства времени C++
Дайте задания для тренировки C++

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

Или воспользуйтесь поиском по форуму:
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
11.01.2011, 20:14     Задачи для тренировки и лучшего понимания #1040
Охщит, кажется при N = 0 надо -1 выводить.
Yandex
Объявления
11.01.2011, 20:14     Задачи для тренировки и лучшего понимания
Закрытая тема Создать тему
Опции темы

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