Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/2010: Рейтинг темы: голосов - 2010, средняя оценка - 4.88
В астрале
Эксперт С++
8022 / 4779 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
1

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

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

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

Список задач, решение которых присутствует в данной теме:
43
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2010, 05:53
Ответы с готовыми решениями:

Элементарные программы, для лучшего понимания языка...
Здравствуйте. Вот сегодня решил что пора изучать с++. Есть пару задач. Начал решать и уже на первой...

Задачи для тренировки и лучшего понимания языка
Предлагаю в этой теме размещать задачи, которые помогут новичкам (и не только) более детально...

Литература для лучшего понимания сути программирования
Привет! Подскажите литературу, которая поможет разобраться в сути самого процесса программирования,...

Набор задачь для тренировки и улучшения понимания программирования
Добрый вечер всем. Если кто знает модскажите где можно найти подобный набор задачь...

1272
Эксперт С++
4707 / 2532 / 753
Регистрация: 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
1
Эксперт С++
4707 / 2532 / 753
Регистрация: 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
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
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;
}
2
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 17:09 1024
silent_1991, Все тесты Ваш код прошел.
0
Freelance
Эксперт С++
2871 / 1806 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
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;
}
1
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
11.01.2011, 17:12 1026

Не по теме:

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



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

Не по теме:

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

0
asics
11.01.2011, 17:15
  #1027

Не по теме:

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

0
silent_1991
11.01.2011, 17:18
  #1028

Не по теме:

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

0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 17:18 1029
asics, Тоже все тесты Ваш код прошел. (Была заминка только с:
C++
1
std::ofstream ofs("uotput.txt");
) Чуть неправильно название файла указали.
1
Freelance
Эксперт С++
2871 / 1806 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
11.01.2011, 17:21 1030

Не по теме:

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


Интиресно, возможно ли решить эту задачу не используя двумерные масивы
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 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
0
Freelance
Эксперт С++
2871 / 1806 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
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;
}
0
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
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 минуты
Всё, можно юзать)))
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 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 ?
0
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
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];
    }
}
2
Эксперт С++
5036 / 3096 / 271
Регистрация: 11.11.2009
Сообщений: 7,047
11.01.2011, 20:13 1036
valeriikozlov, а у меня как?
0
Freelance
Эксперт С++
2871 / 1806 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
11.01.2011, 20:13 1037
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Почему начинаем с i=10 ?
Хм, а что с нуля разве ?
0
Эксперт С++
4707 / 2532 / 753
Регистрация: 18.08.2009
Сообщений: 4,550
11.01.2011, 20:14 1038
silent_1991, Ваш код превышает установленное время на 4-ом тесте (это бывает когда цикл не заканчивается).
Сейчас повнимательней еще посмотрю. А алгоритм используете такой же как и я использовал.
0
silent_1991
11.01.2011, 20:14
  #1039

Не по теме:

asics, с 9 ;)

0
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
11.01.2011, 20:14 1040
Охщит, кажется при N = 0 надо -1 выводить.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2011, 20:14

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

Проверить на правильность и закомментировать весь код для лучшего понимания
Всем здравствуйте. Условие задачи - Заданная матрица целых чисел размером (N, N). Найти среднее...

Нужны задачи для тренировки
Киньте задачки на классы......а то в самоучителе, по которому я учу Сишку....приведены задачки,...

Нужны задачи для тренировки
Здравствуйте киньте пожалуйста задания по с++ для человека начинающего изучать Turbo с++

Нужны задачи для тренировки
Вот не давно был школьный этап по программирование в школе(олимпиады). Меня закинули на городскую,...


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

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

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