Содержание
В подборке 15 задач для тех, кто только начал учить C++. Они идут от простых к сложным и охватывают четыре темы: ввод и вывод с арифметикой, условия, циклы и массивы. К каждой задаче есть условие, пример, решение и короткий разбор.
Как решать, чтобы был толк
- Сначала решите сами. Открывайте решение, только когда программа заработала или Вы потратили на задачу хотя бы 15 минут.
- Проверяйте на своих примерах: ноль, отрицательное число, самое большое значение из условия.
- Если Ваш код отличается от приведённого, это нормально. У задачи обычно несколько правильных решений.
Ввод, вывод и арифметика
Задача 1. Сумма двух чисел
Даны два целых числа. Выведите их сумму.
Пример ввода:
3 5
Пример вывода:
8
Решение:
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
std::cout << a + b << '\n';
}
Оператор >> читает числа по очереди, пропуская пробелы и переводы строк, поэтому числа можно вводить и в одну строку, и в две.
Задача 2. Площадь и периметр прямоугольника
Даны ширина и высота прямоугольника — целые числа. Выведите через пробел его площадь и периметр.
Пример ввода:
4 6
Пример вывода:
24 20
Решение:
#include <iostream>
int main() {
int width, height;
std::cin >> width >> height;
std::cout << width * height << ' ' << 2 * (width + height) << '\n';
}
Скобки в выражении 2 * (width + height) обязательны: без них умножение выполнится раньше сложения.
Задача 3. Секунды в часы, минуты и секунды
Дано количество секунд, прошедших с начала суток. Выведите время в формате Ч:ММ:СС.
Пример ввода:
3725
Пример вывода:
1:02:05
Решение:
#include <iomanip>
#include <iostream>
int main() {
int total;
std::cin >> total;
int hours = total / 3600;
int minutes = total % 3600 / 60;
int seconds = total % 60;
std::cout << hours << ':'
<< std::setw(2) << std::setfill('0') << minutes << ':'
<< std::setw(2) << std::setfill('0') << seconds << '\n';
}
Деление целых чисел отбрасывает дробную часть, а оператор % даёт остаток. Манипуляторы std::setw(2) и std::setfill('0') дополняют минуты и секунды нулём слева.
Задача 4. Сумма цифр трёхзначного числа
Дано трёхзначное число. Найдите сумму его цифр.
Пример ввода:
472
Пример вывода:
13
Решение:
#include <iostream>
int main() {
int number;
std::cin >> number;
int hundreds = number / 100;
int tens = number / 10 % 10;
int units = number % 10;
std::cout << hundreds + tens + units << '\n';
}
Последняя цифра — это остаток от деления на 10. Чтобы добраться до следующей, число сначала делят на 10 нацело.
Условия
Задача 5. Чётное или нечётное
Дано целое число. Выведите «чётное» или «нечётное».
Пример ввода:
7
Пример вывода:
нечётное
Решение:
#include <iostream>
int main() {
int number;
std::cin >> number;
if (number % 2 == 0) {
std::cout << "чётное\n";
} else {
std::cout << "нечётное\n";
}
}
Число чётное, когда остаток от деления на 2 равен нулю. Проверка number % 2 == 0 работает и для отрицательных чисел, а вот number % 2 == 1 для них не годится: остаток будет равен −1.
Задача 6. Наибольшее из трёх чисел
Даны три целых числа. Выведите наибольшее.
Пример ввода:
3 9 5
Пример вывода:
9
Решение:
#include <iostream>
int main() {
int a, b, c;
std::cin >> a >> b >> c;
int max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
std::cout << max << '\n';
}
Сначала считаем наибольшим первое число, затем сравниваем его с остальными. Такой приём легко продолжить на любое количество чисел.
Задача 7. Високосный год
Дан номер года. Выведите YES, если год високосный, и NO в противном случае. Год високосный, если он делится на 4, но не делится на 100, либо делится на 400.
Пример ввода:
1900
Пример вывода:
NO
Решение:
#include <iostream>
int main() {
int year;
std::cin >> year;
bool leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
std::cout << (leap ? "YES" : "NO") << '\n';
}
Условие из задачи переписано почти дословно. Скобки вокруг первой части не обязательны, потому что && выполняется раньше ||, но с ними выражение читается однозначно.
Задача 8. Существует ли треугольник
Даны длины трёх отрезков — целые положительные числа. Выведите YES, если из них можно составить треугольник, и NO, если нельзя.
Пример ввода:
1 2 3
Пример вывода:
NO
Решение:
#include <iostream>
int main() {
int a, b, c;
std::cin >> a >> b >> c;
if (a + b > c && a + c > b && b + c > a) {
std::cout << "YES\n";
} else {
std::cout << "NO\n";
}
}
Треугольник существует, когда каждая сторона меньше суммы двух других. Отрезки 1, 2 и 3 не подходят: 1 + 2 не больше 3.
Задача 9. Калькулятор
Даны число, знак операции (+, -, * или /) и второе число. Выведите результат. При делении на ноль выведите «На ноль делить нельзя», при неизвестном знаке — «Неизвестная операция».
Пример ввода:
7 / 2
Пример вывода:
3.5
Решение:
#include <iostream>
int main() {
double a, b;
char operation;
std::cin >> a >> operation >> b;
switch (operation) {
case '+':
std::cout << a + b << '\n';
break;
case '-':
std::cout << a - b << '\n';
break;
case '*':
std::cout << a * b << '\n';
break;
case '/':
if (b == 0) {
std::cout << "На ноль делить нельзя\n";
} else {
std::cout << a / b << '\n';
}
break;
default:
std::cout << "Неизвестная операция\n";
}
}
Знак операции читается в переменную типа char, а switch выбирает ветку по её значению. Числа объявлены как double, иначе 7 / 2 дало бы 3. Подробнее об операторе — в статье Оператор switch в C++.
Циклы
Задача 10. Сумма чисел от 1 до N
Дано натуральное число N. Найдите сумму всех целых чисел от 1 до N.
Пример ввода:
100
Пример вывода:
5050
Решение:
#include <iostream>
int main() {
int n;
std::cin >> n;
long long sum = 0;
for (int i = 1; i <= n; ++i) {
sum += i;
}
std::cout << sum << '\n';
}
Сумма хранится в long long: при больших N она не помещается в int. Ту же задачу решает формула n * (n + 1) / 2, но цикл показывает общий приём — накопление результата.
Задача 11. Факториал
Дано целое число N от 0 до 20. Выведите N! — произведение всех целых чисел от 1 до N. Факториал нуля равен 1.
Пример ввода:
20
Пример вывода:
2432902008176640000
Решение:
#include <iostream>
int main() {
int n;
std::cin >> n;
long long factorial = 1;
for (int i = 2; i <= n; ++i) {
factorial *= i;
}
std::cout << factorial << '\n';
}
Произведение начинается с единицы, поэтому для N = 0 и N = 1 цикл не выполняется ни разу и ответ остаётся верным. Число 21! уже не помещается в long long, отсюда ограничение в условии.
Задача 12. Количество и сумма цифр
Дано целое неотрицательное число. Выведите через пробел количество его цифр и их сумму.
Пример ввода:
50731
Пример вывода:
5 16
Решение:
#include <iostream>
int main() {
long long number;
std::cin >> number;
int count = 0;
int sum = 0;
do {
sum += number % 10;
++count;
number /= 10;
} while (number > 0);
std::cout << count << ' ' << sum << '\n';
}
Цикл do ... while выполняет тело хотя бы один раз, поэтому для числа 0 программа правильно ответит: одна цифра, сумма 0. С обычным while ноль пришлось бы обрабатывать отдельно.
Задача 13. Простое число
Дано натуральное число N. Выведите YES, если оно простое, и NO в противном случае.
Пример ввода:
97
Пример вывода:
YES
Решение:
#include <iostream>
int main() {
int n;
std::cin >> n;
bool prime = n >= 2;
for (int d = 2; d * d <= n; ++d) {
if (n % d == 0) {
prime = false;
break;
}
}
std::cout << (prime ? "YES" : "NO") << '\n';
}
Делители достаточно искать до квадратного корня из N: если у числа есть делитель больше корня, то парный ему делитель меньше корня. Условие d * d <= n выражает это без дробных чисел. Единица простым числом не считается, поэтому начальное значение — n >= 2.
Задача 14. FizzBuzz
Дано число N. Выведите числа от 1 до N, каждое с новой строки. Вместо чисел, кратных 3, выведите Fizz, вместо кратных 5 — Buzz, вместо кратных и 3, и 5 — FizzBuzz.
Пример ввода:
5
Пример вывода:
1
2
Fizz
4
Buzz
Решение:
#include <iostream>
int main() {
int n;
std::cin >> n;
for (int i = 1; i <= n; ++i) {
if (i % 15 == 0) {
std::cout << "FizzBuzz\n";
} else if (i % 3 == 0) {
std::cout << "Fizz\n";
} else if (i % 5 == 0) {
std::cout << "Buzz\n";
} else {
std::cout << i << '\n';
}
}
}
Порядок проверок важен: кратность 15 проверяется первой. Если начать с проверки на 3, для числа 15 программа выведет Fizz и до ветки FizzBuzz не дойдёт.
Массивы
Задача 15. Наибольший элемент и его номер
В первой строке дано число N, во второй — N целых чисел. Выведите наибольшее из них и его номер (нумерация с единицы). Если наибольших несколько, выведите номер первого.
Пример ввода:
5
3 9 2 9 4
Пример вывода:
9 2
Решение:
#include <iostream>
#include <vector>
int main() {
int n;
std::cin >> n;
std::vector<int> numbers(n);
for (int i = 0; i < n; ++i) {
std::cin >> numbers[i];
}
int best = 0;
for (int i = 1; i < n; ++i) {
if (numbers[i] > numbers[best]) {
best = i;
}
}
std::cout << numbers[best] << ' ' << best + 1 << '\n';
}
Программа запоминает не само значение, а индекс наибольшего элемента. Строгое сравнение > оставляет первый из одинаковых элементов. Индексы в C++ начинаются с нуля, поэтому при выводе к индексу прибавляется единица.
Что дальше
Решения выше можно только прочитать, а навык появляется, когда код проверяет кто-то строгий. В уроках учебника к каждой теме есть задачи с автоматической проверкой: программа запускается на наборе тестов, и Вы сразу видите результат.
- Введение в C++: история, компиляция и первая программа — ввод и вывод.
- Типы данных и арифметические операторы — арифметика и приведение типов.
- Условные конструкции в C++ —
if,switchи тернарный оператор.
Если программа не собирается или падает при запуске, загляните в разборы частых ошибок: undefined reference и segmentation fault.