А вот и решение:
```
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
bool running = true;
long long M, N;
cin >> M >> N;
vector<long long> result;
for (long long number = M; number <= N; number++) {
if (number <= 1) {
running = false;
}
else running = true;
if (running)
{
long long divisorsSum = 1;
long long sqrtNum = sqrt(number);
for (long long i = 2; i <= sqrtNum; i++) {
if (number % i == 0) {
divisorsSum += i;
if (i != number / i) {
divisorsSum += number / i;
}
}
}
if(divisorsSum == number)result.push_back(number);
}
}
if (result.empty()) {
cout << "Absent" << endl;
}
else {
for (long long perfectNumber : result) {
cout << perfectNumber << endl;
}
}
return 0;
}
```
```
using namespace std;
int main() {
bool running = true;
long long M, N;
cin >> M >> N;
vector<long long> result;
for (long long number = M; number <= N; number++) {
if (number <= 1) {
running = false;
}
else running = true;
if (running)
{
long long divisorsSum = 1;
long long sqrtNum = sqrt(number);
for (long long i = 2; i <= sqrtNum; i++) {
if (number % i == 0) {
divisorsSum += i;
if (i != number / i) {
divisorsSum += number / i;
}
}
}
if(divisorsSum == number)result.push_back(number);
}
}
if (result.empty()) {
cout << "Absent" << endl;
}
else {
for (long long perfectNumber : result) {
cout << perfectNumber << endl;
}
}
return 0;
}
```
❤1👍1🔥1
Решение:
#include <iostream>
#include <vector>
using namespace std;
#define ll long long
int main() {
ll n = 0,result = 0;
cin >> n;
vector<ll[2]> sort(n);
vector<ll>xref;
vector<ll> yref;
for (ll i = 0; i < n; i++) {
ll x, y;
cin >> x >> y;
sort[i][0] = x;
sort[i][1] = y;
if (i == 0) { xref.push_back(x); yref.push_back(y); }
ll temp = 0;
for (ll j = 0; j < xref.size(); j++) {
if (xref[j] != x)temp++;
if (temp == xref.size()) xref.push_back(x);
}
temp = 0;
for (ll j = 0; j < yref.size(); j++) {
if (yref[j] != y)temp++;
if (temp == yref.size()) yref.push_back(y);
}
}
for (ll i = 0; i < xref.size(); i++) {
vector<ll> arr;
ll dots = xref[i];
ll counter = 0;
for (ll j = 0; j < sort.size(); j++) {
if (sort[j][0] == dots) {
counter++;
}
}
if (counter == 3)result++;
else if (counter > 3)result += counter / 3;
}
for (ll i = 0; i < yref.size(); i++) {
vector<ll> arr;
ll dots = yref[i];
ll counter = 0;
for (ll j = 0; j < sort.size(); j++) {
if (sort[j][1] == dots) {
counter++;
}
}
if (counter == 3)result++;
else if (counter > 3)result += counter / 3;
}
cout << result;
return 0;
}
C++ Chanel
Очень интересная задача,сегодня была на олимпиаде: дается числа m и n: m ширина n высота вывести рисунок,например: m=4 n=6 “x..x” “.xx.” “.xx.” “x..x” “.xx.” “.xx.” Решение как всегда кину сегодня вечером Накидайте 🔥🔥🔥 если вам интересный такой формат
Решение(в коменты кидали на пайтоне)
#include <iostream>
using namespace std;
int main() {
int m, n;
cin >> n >> m;
string column;
int left = 0;
int right = m - 1;
for (int i = 0; i < m; i++)column += '.';
for (int i = 0; i < n; i++) {
string copyColumn = column;
for (int j = 0; j < m; j++) {
if (j == left)copyColumn[left] = 'x';
if (j == right)copyColumn[right] = 'x';
}
right--;
left++;
if (right == 0)right = m-1;
if (left == m-1)left = 0;
cout << copyColumn << endl;
}
return 0;
}
👏1
C++ Chanel
Идея для консольного приложения Создать класс который будет рисовать фигуры в консоли разными символами,с заливкой или без Позже выложу код
#include <iostream>
class Artist {
public:
void Start() {
Requesting();
}
private:
void Requesting() {
std::string figure;
bool run = 0; // run будет равна false
std::cout << "Write what figure you want to draw: \n 1: Romb \n 2: Square \n 3: Triangle \n Write number or figure name: ";
std::cin >> figure;
while (!run) {
if (figure == "1" || figure == "Romb") {
DrawRomb();
break;
}
else if (figure == "2" || figure == "Square") {
DrawSquare();
break;
}
else if (figure == "3" || figure == "Triangle") {
DrawTriangle();
break;
}
else {
std::cout << "Please enter again: ";
std::cin >> figure;
}
}
}
void DrawRomb() {
int radius{}; // radius == 0
std::cout << "Enter radius: ";
std::cin >> radius;
std::cout << "\n";
int xval = radius;
bool part1 = 1;
int sval = radius + 1;
for (int i = 0; i < (radius * 2) + 1; ++i) {
for (int j = 0; j < (radius * 2) + 2; ++j) {
if (j == xval || j == sval) {
if (j == xval) {
std::cout << "x";
}
if (j == sval) {
std::cout << "s";
}
}
else {
std::cout << " ";
}
}
if (i >= radius)part1 = false;
if (part1) {
--xval;
++sval;
}
else {
++xval;
--sval;
}
std::cout << std::endl;
}
}
void DrawTriangle() {
int height{};
char c;
std::cout << "Write height: ";
std::cin >> height;
std::cout << "\nWrite symbol to draw triangle: ";
std::cin >> c;
int index = height;
int index2 = height - 1;
std::cout << "\n";
for (int y = 0; y < height; ++y) {
for (int x = 0; x < height * 2; ++x) {
if (y == height - 1)
std::cout << c;
else if (x == index || x == index2)
std::cout << c;
else std::cout << ' ';
}
index++;
index2--;
std::cout << "\n";
}
}
void DrawSquare() {
int size{};
std::string temp;
std::cout << "Write size of side: ";
std::cin >> size;
std::cout << "\nFilled? (yes/no): ";
std::cin >> temp;
bool filled = temp == "yes";
if (!filled) {
for (int y = 0; y < size; ++y) {
for (int x = 0; x < size; ++x) {
if (y == 0 || y == size - 1)
std::cout << '#';
else if (x == 0 || x == size - 1)
std::cout << '#';
else
std::cout << ' ';
}
std::cout << "\n";
}
}
else {
for (int y = 0; y < size; ++y) {
for (int x = 0; x < size; ++x) {
std::cout << '#';
}
std::cout << "\n";
}
}
}
};
int main() {
Artist art;
art.Start();
return 0;
}
❤2🔥1
Решение задачи:
#include <iostream>
#include <set>
using namespace std;
int main()
{
int n;
cin >> n;
int p;
int q;
set<int> res;
cin >> p;
for (int i = 0; i < p; ++i) {
int temp;
cin >> temp;
res.insert(temp);
}
cin >> q;
for (int i = 0; i < q; ++i) {
int temp;
cin >> temp;
res.insert(temp);
}
if (res.size() == n && *--res.end() == n) {
cout << "I become the guy.";
}
else {
cout << "Oh, my keyboard!";
}
return 0;
}
🍓3
Решение задачи:
#include <iostream>
#include <set>
#include <map>
#include <vector>
using namespace std;
int main() {
int t{};
cin>>t;
vector<string> res;
for(int g = 0;g<t;++g){
int n;
cin>>n;
string result;
vector<int> v(n,0);
for(int i = 0;i<n;++i){
cin>>v[i];
}
map<char,int> m;
for(int i = 0;i<n;++i){
int w = 97;
for(int j = 0;j<26;++j){
if(m[w] == v[i]){
result+=(char)(w);
++m[w];
break;
}else{
w++;
}
}
}
res.push_back(result);
}
for(string s : res){
cout<<s<<endl;
}
return 0;
}
Что автоматически перегружаеться при создании объекта с++?
При создании любого объекта автоматически происходит перегрузка нескольких операций а именно:
-Конструктор
Он перегружаеться для создания и инициализации объекта.Если не определить собственный - то компилятор сделает это за вас.
-Деструктор
Деструктор вызывается при удаления объекта и освобождает ресурсы занятые объектом.Если не определить собственный - то компилятор сделает это за вас.
-Конструктор копирования
Этот конструктор копирует значения членов одного объекта в другой объект того же типа.Если не определить собственный - то компилятор сделает это за вас.
-Оператор присваивания
Если вы не определите собственный оператор присваивания (operator=), компилятор сгенерирует его для вас. Этот оператор копирует один объект в другой, что позволяет выполнить присваивание между объектами.
-Конструктор перемещения
Представляет альтернативу конструктору копирования в тех ситуациях, когда надо сделать копию объекта, но копирование данных нежелательно - вместо копирования данных они просто перемещаются из одной копии объекта в другую.
Давайте посмотрим на код и сами в этом убедимся:
Такой код не получиться запустить так как не существует конструктора по умолчанию.
Для того чтобы исправить этот код нужно либо сделать автоматические значения либо перегрузить конструктор без параметров.
Код:
При создании любого объекта автоматически происходит перегрузка нескольких операций а именно:
-Конструктор
Он перегружаеться для создания и инициализации объекта.Если не определить собственный - то компилятор сделает это за вас.
-Деструктор
Деструктор вызывается при удаления объекта и освобождает ресурсы занятые объектом.Если не определить собственный - то компилятор сделает это за вас.
-Конструктор копирования
Этот конструктор копирует значения членов одного объекта в другой объект того же типа.Если не определить собственный - то компилятор сделает это за вас.
-Оператор присваивания
Если вы не определите собственный оператор присваивания (operator=), компилятор сгенерирует его для вас. Этот оператор копирует один объект в другой, что позволяет выполнить присваивание между объектами.
-Конструктор перемещения
Представляет альтернативу конструктору копирования в тех ситуациях, когда надо сделать копию объекта, но копирование данных нежелательно - вместо копирования данных они просто перемещаются из одной копии объекта в другую.
"Если не определить собственный - то компилятор сделает это за вас."
Давайте посмотрим на код и сами в этом убедимся:
#include <iostream>
class Chiken {
private:
int m_age;
std::string m_name;
public:
Chiken(int age, std::string name) :m_age(age), m_name(name) {
std::cout << "Constructor called" << std::endl;
}
int GetAge() const { return m_age; }
std::string GetName() const { return m_name; }
};
int main() {
Chiken chik1;
std::cout<<chik1.GetName();
}
Такой код не получиться запустить так как не существует конструктора по умолчанию.
Для того чтобы исправить этот код нужно либо сделать автоматические значения либо перегрузить конструктор без параметров.
Код:
#include <iostream>
class Chiken {
private:
int m_age;
std::string m_name;
public:
Chiken(int age = 0, std::string name = "Unnamed") :m_age(age), m_name(name) {
std::cout << "Constructor called" << std::endl;
}
int GetAge() const { return m_age; }
std::string GetName() const { return m_name; }
};
int main() {
Chiken chik;//вызов конструктора
Chiken chik1(12,"Vasya");//вызов конструктора
std::cout<<chik.GetName()<<std::endl;
Chiken chik2 = chik1;//Оператор присваивания
Chiken chik3(chik2); //Копирования конструктора
std::cout << chik3.GetAge();
}// вызов деструктора
Абстрактные классы
Ключевое слово class в С++ используется для объявления пользовательского типа данных.Так же это очень мощный инструмент ООП который позволяет объединять данные и методы в один объект.
Если мы хотим создать иерархию классов животных: собак,лошадей,кошек,свиней.Что нам делать?Тут вступает абстрактный класс...
С microsoft документации по С++:
То есть для того чтобы класс считался абстрактным нужна хотя-бы одна чисто виртуальная функция (pure-virtual function) .
В нашем случае мы можем сделать наш Animal клас абстрактным и наследовать наши дочерние классы. Рассмотрим на примере:
Вывод:
1. Объект абстрактного класса не может быть создан,но можно выделять динамическую память на дочерние классы через указатель или ссылку.
2. Классы наследники должны переопределить все pure-virtual функции, иначе они остануться абстрактными.
3. В нашем примере класс Animal предоставляет общие функции но он не сможет ходить,бегать,прыгать так как это КАТЕГОРИЯ ОРГАНИЗМОВ - его можно записывать в абстрактные классы.
Ключевое слово class в С++ используется для объявления пользовательского типа данных.Так же это очень мощный инструмент ООП который позволяет объединять данные и методы в один объект.
Если мы хотим создать иерархию классов животных: собак,лошадей,кошек,свиней.Что нам делать?Тут вступает абстрактный класс...
С microsoft документации по С++:
Абстрактные классы используются в качестве обобщенных концепций, на основе которых можно создавать более конкретные производные классы. Невозможно создать объект абстрактного типа класса. Однако можно использовать указатели и ссылки на абстрактные типы классов.
Вы создаете абстрактный класс, объявляя по крайней мере одну чистую виртуальную функцию-член. Это виртуальная функция, объявленная с помощью синтаксиса чистого описателя (= 0). Классы, производные от абстрактного класса, должны реализовывать чисто виртуальную функцию; в противном случае они также будут абстрактными.
То есть для того чтобы класс считался абстрактным нужна хотя-бы одна чисто виртуальная функция (pure-virtual function) .
В нашем случае мы можем сделать наш Animal клас абстрактным и наследовать наши дочерние классы. Рассмотрим на примере:
#include <iostream>
class Animal {
public:
virtual void Speak() const = 0;
virtual ~Animal() {}
};//наш абстрактный класс
class Dog : public Animal{
public:
virtual void Speak() const override { std::cout << "Dog speak! \n"; }
virtual ~Dog() {}
};
class Cat : public Animal {
public:
virtual void Speak() const override { std::cout << "Cat speak! \n"; }
virtual ~Cat() {}
};
int main() {
//Animal* prt = new Animal(); - ошибка
Animal* ptr = new Dog();
ptr->Speak();
delete ptr;
ptr = new Cat();
ptr->Speak();
delete ptr;
}
Вывод:
1. Объект абстрактного класса не может быть создан,но можно выделять динамическую память на дочерние классы через указатель или ссылку.
2. Классы наследники должны переопределить все pure-virtual функции, иначе они остануться абстрактными.
3. В нашем примере класс Animal предоставляет общие функции но он не сможет ходить,бегать,прыгать так как это КАТЕГОРИЯ ОРГАНИЗМОВ - его можно записывать в абстрактные классы.
#include <iostream>
class A{
public:
A(){std::cout<<"A";}
};
class B{
public:
B(){std::cout<<"B";}
};
class C{
private:
B b;
A a;
public:
C() : a(),b(){ }
};
int main(){
C c;
}
#Cpp
👍3
Решение с объяснением:
#include <iostream>
#include <vector>
using namespace std;
//вспомогательная функция рассчитывает кол-во различных мест внутри ящика
long long counter(const vector<long long>& v,const vector<long long>& rv){
long long result{};
if(v == rv) // если наш куб равен размеру ящика,то он вмещаеться только один раз
return 1;
for(long long i = v[1];i<=rv[1];++i){ // идем по длине
result+=rv[0] - v[0] + 1; // каждую ширину в результат
}
int z = rv[2] - v[2] + 1; // высота
return result*z;
}
int main(){
int t;cin>>t;
vector<long long> result;
for(int d = 0;d<t;++d){
long long x,y,z,S;cin>>x>>y>>z>>S;
long long maxValue{};
for(long long a = 1;a<=x;++a){
for(long long b = 1;b<=y;++b){
long long c = S/(a*b); // можно сделать цикл от 1 до z - не проходит по рантайму
// так как будут повторы a и b
if(z>=c){ // если с не выходит за пределы
if(a*b*c == S ){ // если объем равен k ( в моем случае S)
long long temp = counter({a,b,c},{x,y,z}); // создаю переменную
// для хранения расчетов;
// альтернативы:
/*
1. создать переменную в условии if
2. вызвать counter в присвоении и if
функция будет вызываться по два раза
*/
if(temp > maxValue)
maxValue = temp;
}
}
}
}
result.push_back(maxValue); // вносим в наш вектор наибольшее значение,
// если такого не нашлось - выводим ноль
}
for(const auto& i: result){ // вывод
cout<<i<<endl;
}
}
🔥4
Предикаты
Все сталкивались либо просто знают про библиотеку algorithm, в ней есть множество шаблонных функций которые облегчают работу.Все они УНИВЕРСАЛЬНЫЕ так как в аргументы принимают не контейнер целиком и не ссылки на него, а итераторы , которые позволяют проходить объекты без особого различия между разными типами контейнеров.
Что такое предикаты?
Это функция или объект (у которого перегружен bool operator()) который имеет меньше двух параметров включительно.Предикаты бывают унарными(один параметр) и бинарными(два параметра).
Но зачем вообще давать этому отдельное название?
А дело в том, что почти все алгоритмы библиотеки STL принимают предикат последним аргументом.Мы можем возвращать что хотим (true/false) и от этого будет зависеть содержимое контейнера.Для примера возмем алгоритм sort():
Он перегружен и имеет два вида:
Имеет два параметра которые обозначают диапазон [begin,end).
Имеет три параметра первые два обозначают диапазон [begin,end), а третий - бинарный предикат.
Первыйй тип это обычная функция sort которая сортирует элементы в диапазоне в порядке возрастания.
Во втором мы можем коректировать как именно мы хотим отсортировать его.
Пример (первый с функцией, второй с лямбдой):
Вывод будет одинаковым:
Все сталкивались либо просто знают про библиотеку algorithm, в ней есть множество шаблонных функций которые облегчают работу.Все они УНИВЕРСАЛЬНЫЕ так как в аргументы принимают не контейнер целиком и не ссылки на него, а итераторы , которые позволяют проходить объекты без особого различия между разными типами контейнеров.
Что такое предикаты?
Это функция или объект (у которого перегружен bool operator()) который имеет меньше двух параметров включительно.Предикаты бывают унарными(один параметр) и бинарными(два параметра).
Но зачем вообще давать этому отдельное название?
А дело в том, что почти все алгоритмы библиотеки STL принимают предикат последним аргументом.Мы можем возвращать что хотим (true/false) и от этого будет зависеть содержимое контейнера.Для примера возмем алгоритм sort():
Он перегружен и имеет два вида:
Имеет два параметра которые обозначают диапазон [begin,end).
Имеет три параметра первые два обозначают диапазон [begin,end), а третий - бинарный предикат.
Первыйй тип это обычная функция sort которая сортирует элементы в диапазоне в порядке возрастания.
Во втором мы можем коректировать как именно мы хотим отсортировать его.
Пример (первый с функцией, второй с лямбдой):
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool predicate(int lhs,int rhs){
return !(lhs < rhs); // in parentheses due to precedence
}
int main(){
vector<int> v{0,512,22,54,222,10};
sort(v.begin(),v.end(),predicate);
for(const auto& i : v)
cout<<i<<" ";
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> v{0,512,22,54,222,10};
sort(v.begin(),v.end(),[](int lhs,int rhs){
return !(lhs < rhs);
});
for(const auto& i : v)
cout<<i<<" ";
}
Вывод будет одинаковым:
512 222 54 22 10 0
👍3❤1