Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/2345: Рейтинг темы: голосов - 2345, средняя оценка - 4.54
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

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

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

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

Список задач, решение которых присутствует в данной теме:
44
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.07.2010, 05:53
Ответы с готовыми решениями:

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

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

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

1272
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 16:09
Студворк — интернет-сервис помощи студентам
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
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 16:09
Шахматная доска
(Время: 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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.01.2011, 17:06
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
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 17:09
silent_1991, Все тесты Ваш код прошел.
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
11.01.2011, 17:10
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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.01.2011, 17:12

Не по теме:

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



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

Не по теме:

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

0
11.01.2011, 17:15

Не по теме:

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

0
11.01.2011, 17:18

Не по теме:

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

0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 17:18
asics, Тоже все тесты Ваш код прошел. (Была заминка только с:
C++
1
std::ofstream ofs("uotput.txt");
) Чуть неправильно название файла указали.
1
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
11.01.2011, 17:21

Не по теме:

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


Интиресно, возможно ли решить эту задачу не используя двумерные масивы
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 19:11
Произведение цифр
(Время: 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
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
11.01.2011, 19:46
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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.01.2011, 19:55
Хм... что-то не особо уверен...

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
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 20:06
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
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
11.01.2011, 20:08
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
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
11.01.2011, 20:13
valeriikozlov, а у меня как?
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
11.01.2011, 20:13
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Почему начинаем с i=10 ?
Хм, а что с нуля разве ?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
11.01.2011, 20:14
silent_1991, Ваш код превышает установленное время на 4-ом тесте (это бывает когда цикл не заканчивается).
Сейчас повнимательней еще посмотрю. А алгоритм используете такой же как и я использовал.
0
11.01.2011, 20:14

Не по теме:

asics, с 9 ;)

0
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
11.01.2011, 20:14
Охщит, кажется при N = 0 надо -1 выводить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2011, 20:14
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
1040
Закрытая тема Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru