Пост от 20.02.2026, 20:57:00

Отредактирован 25.02.2026, 09:09:09

Категории: programming

Время чтения: 5мин.

Была дана такая задачка:

Задание. Даны два массива C1, C2, …, Cn и P1, P2, …, Pn. Если каждый элемент первого массива меньше суммы элементов второго, найти при каких значениях i и j максимально значение выражения Ci / (Pj + Cj 2 ).

Для демонстрации нисходящей и восходящей разработки. Для того чтобы вспомнить хоть немного C++, на нём и писал, т.к. крайне долгое время не писал на нём.

В итоге получилось:

from-top-descending.cpp
#include <cstdint>
#include <print>
#include <iostream>
#include <vector>
#include <numeric>
#include <stdint.h>
int main(){
std::vector<int> array_c;
std::vector<int> array_p;
signed quantity = 0;
std::print("Введите количество цифр для множеств C и P: ");
std::cin >> quantity;
std::print("Введите цифры C: ");
for(signed i =0;i< quantity ;i++){
int number;
std::cin >> number;
array_c.push_back(number);
}
std::print("Введите цифры P: ");
for(int i =0;i< quantity ;i++){
int number;
std::cin >> number;
array_p.push_back(number);
}
int sum_of_array_p = std::accumulate(array_p.begin(), array_p.end(), 0);
bool is_all_positive = true;
for (const int& x: array_c ){
if (x > sum_of_array_p){
std::print("Элемент первого массива больше или равен сумме элементов другого");
return 0 ;
}
}
float max_calculation = array_c[0] / (array_p[0] + array_c[0] * 2);
for(int i = 0; i < quantity; i++){
for(int j =0; j < quantity; j++){
float max_calculated = (float)array_c[i] / (float)(array_p[j] + array_c[j] * 2);
if(max_calculated > max_calculation){
max_calculation = max_calculated;
}
}
}
std::print("Максимальное значение выражения Ci / (Pj + Cj * 2): {0}", max_calculation);
}
from-bottom-ascending.cpp
#include <cstdint>
#include <print>
#include <iostream>
#include <vector>
#include <numeric>
#include <stdint.h>
class FormulaCalculator{
private:
std::vector<int> array_c;
std::vector<int> array_p;
public:
FormulaCalculator(std::vector<int> arr_c, std::vector<int> arr_p): array_c(arr_c), array_p(arr_p){
if (arr_c.size() != arr_p.size()){
throw "Ошибка размеров!";
}
}
int get_sum_of_array(const std::vector<int> &array){
return std::accumulate(array.begin(), array.end(), 0);
}
bool check_for_requirement(){
int sum_of_array_p = get_sum_of_array(array_p);
for (const int& x: array_c){
if (x > sum_of_array_p){
return false;
}
}
return true;
}
float calculate(){
float max_calculation = array_c[0] / (array_p[0] + array_c[0] * 2);
for(int i = 0; i < array_c.size(); i++){
for(int j =0; j < array_c.size() ; j++){
float max_calculated = (float)array_c[i] / (float)(array_p[j] + array_c[j] * 2);
if(max_calculated > max_calculation){
max_calculation = max_calculated;
}
}
}
return max_calculation;
}
};
void get_values_for_array(std::vector<int> &array, signed quantity){
for(signed i = 0;i< quantity ;i++){
int number;
std::cin >> number;
array.push_back(number);
}
}
int main(){
std::vector<int> array_c;
std::vector<int> array_p;
signed quantity = 0;
std::print("Введите количество цифр для множеств C и P: ");
std::cin >> quantity;
std::print("Введите цифры C: ");
get_values_for_array(array_c, quantity);
std::print("Введите цифры P: ");
get_values_for_array(array_p, quantity);
FormulaCalculator calc(array_c,array_p);
if (!calc.check_for_requirement()){
std::print("Элемент первого массива больше или равен сумме элементов другого");
return 0;
}
float max_calculation = calc.calculate();
std::print("Максимальное значение выражения Ci / (Pj + Cj * 2): {0}", max_calculation);
}
from-top-descending.cpp
#include <cstdint>
#include <print>
#include <iostream>
#include <vector>
#include <numeric>
#include <stdint.h>
int main(){
std::vector<int> array_c;
std::vector<int> array_p;
signed quantity = 0;
std::print("Введите количество цифр для множеств C и P: ");
std::cin >> quantity;
std::print("Введите цифры C: ");
for(signed i =0;i< quantity ;i++){
int number;
std::cin >> number;
array_c.push_back(number);
}
std::print("Введите цифры P: ");
for(int i =0;i< quantity ;i++){
int number;
std::cin >> number;
array_p.push_back(number);
}
int sum_of_array_p = std::accumulate(array_p.begin(), array_p.end(), 0);
bool is_all_positive = true;
for (const int& x: array_c ){
if (x > sum_of_array_p){
std::print("Элемент первого массива больше или равен сумме элементов другого");
return 0 ;
}
}
float max_calculation = array_c[0] / (array_p[0] + array_c[0] * 2);
int max_i = 0;
int max_j = 0;
for(int i = 0; i < quantity; i++){
for(int j = 0; j < quantity; j++){
float max_calculated = (float)array_c[i] / (float)(array_p[j] + array_c[j] * 2);
if(max_calculated > max_calculation){
max_calculation = max_calculated;
max_i = i;
max_j = j;
}
}
}
std::print("Максимальное значение выражения Ci / (Pj + Cj * 2): {0}", max_calculation);
std::print("При i = {}, j = {}", max_i, max_j);
}
from-bottom-ascending.cpp
#include <cstdint>
#include <iostream>
#include <numeric>
#include <print>
#include <stdint.h>
#include <vector>
class FormulaCalculator {
private:
std::vector<int> array_c;
std::vector<int> array_p;
public:
FormulaCalculator(std::vector<int> arr_c, std::vector<int> arr_p) : array_c(arr_c), array_p(arr_p) {
if (arr_c.size() != arr_p.size()) {
throw "Ошибка размеров!";
}
}
int get_sum_of_array(const std::vector<int> &array) {
return std::accumulate(array.begin(), array.end(), 0);
}
bool check_for_requirement() {
int sum_of_array_p = get_sum_of_array(array_p);
for (const int &x : array_c) {
if (x > sum_of_array_p) {
return false;
}
}
return true;
}
std::tuple<float, int, int> calculate() {
float max_calculation = (float)array_c[0] / (array_p[0] + array_c[0] * 2);
int max_i = 0;
int max_j = 0;
for (int i = 0; i < array_c.size(); i++) {
for (int j = 0; j < array_c.size(); j++) {
float max_calculated = (float)array_c[i] / (float)(array_p[j] + array_c[j] * 2);
if (max_calculated > max_calculation) {
max_calculation = max_calculated;
max_i = i;
max_j = j;
}
}
}
return {max_calculation, max_i, max_j};
}
};
void get_values_for_array(std::vector<int> &array, signed quantity) {
for (signed i = 0; i < quantity; i++) {
int number;
std::cin >> number;
array.push_back(number);
}
}
int main() {
std::vector<int> array_c;
std::vector<int> array_p;
signed quantity = 0;
std::println("Введите количество цифр для множеств C и P: ");
std::cin >> quantity;
std::println("Введите цифры C: ");
get_values_for_array(array_c, quantity);
std::println("Введите цифры P: ");
get_values_for_array(array_p, quantity);
FormulaCalculator calc(array_c, array_p);
if (!calc.check_for_requirement()) {
std::println("Элемент первого массива больше или равен сумме элементов другого");
return 0;
}
auto max_calculation = calc.calculate();
std::println("Максимальное значение выражения Ci / (Pj + Cj * 2): {0}", std::get<0>(max_calculation));
std::println("При i = {}, j = {}", std::get<1>(max_calculation), std::get<2>(max_calculation));
}