С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 07.10.2022
Сообщений: 23

Сложить числа записанные в указанном формате

09.07.2023, 16:22. Показов 1032. Ответов 8

Студворк — интернет-сервис помощи студентам
А здесь точно длинная арифметика?

Один из используемых форматов заключается в следующем: число задаётся группами подряд идущих в
десятичной записи цифр. То есть число 111 задаётся как 3 1, чисор 2020 — как 1 2 1 0 1 2 1 0, число 222 233
как 4 2 2 3. Отметим, что длина группы должна быть максимальной, то есть запись 2 2 2 2 2 3 в последнем
случае является некорректной.
Для проверки ответов игроков Вам требуется написать программу, складывающую числа в вышеописанном
формате
Формат входных данных:
Первая строка входных данных содержит целое число N — количество групп одинаковых цифр в записи
первого слагаемого (1 ≤ N ≤ 100). i-я из последующих N строк содержит по два целых числа ni и di
(1 ≤ ni ≤ 10^18 , 0 ≤ di ≤ 9). Гарантируется, что соседние di всегда различны, di != 0 и сумма всех ni не превосходит 10^18
В таком же формате идет второе слагаемое.
Вывод нужен в формате таком же как и ввод
Мой код у которого лимит по памяти выходит. При этом тут все минимально возможное с затратами памяти.
Тест на котором я ее проверял
Кликните здесь для просмотра всего текста
3
2 2
3 3
9 9
1
1 1
ответ
4
2 2
2 3
1 4
9 0

Если у вас будут какие то свои идеи как его можно оптимизировать пишите.
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <vector>
 
using namespace std;
 
struct vv{
    int c, num;
};
 
void printBigNumber(const std::vector<int>& number) {
    int cnt = 0;
    std::vector<vv> kk;
    for (int k = 0; k < number.size(); ++k) {
        if (k + 1 < number.size()) {
            if (number[k] == number[k + 1]) {
                cnt++;
            } else {
                kk.push_back({cnt + 1, number[k]});
                cnt = 0;
            }
        } else {
            kk.push_back({cnt + 1, number[k]});
        }
    }
    std::cout << kk.size() << std::endl;
    for (auto j: kk) {
        std::cout << j.c << ' ' << j.num << '\n';
    }
//    for(auto k : number){
//        std::cout << k << ' ';
//    }
}
 
int main() {
    vector<int> a;
    vector<int> b;
    const int base = 1000 * 1000 * 1000;
    int n;
    string stra;
    string strb;
    cin >> n;
    while (n--) {
        int c;
        char num;
        cin >> c >> num;
        while (c--) {
            stra.push_back(num);
        }
    }
    cin >> n;
    while (n--) {
        int c;
        char num;
        cin >> c >> num;
        while (c--) {
            strb.push_back(num);
        }
    }
    for (int i = (int) stra.length(); i > 0; i -= 9) {
        if (i < 9)
            a.push_back(atoi(stra.substr(0, i).c_str()));
        else
            a.push_back(atoi(stra.substr(i - 9, 9).c_str()));
    }
    for (int i = (int) strb.length(); i > 0; i -= 9){
        if (i < 9)
            b.push_back(atoi(strb.substr(0, i).c_str()));
        else
            b.push_back(atoi(strb.substr(i - 9, 9).c_str()));
    }
    for(auto k : a){
        std::cout << k;
    }
    cout << '+';
    for(auto k : b){
        std::cout << k;
    }
    cout << endl;
    int carry = 0;
    for (size_t i=0; i<max(a.size(),b.size()) || carry; ++i) {
        if (i == a.size())
            a.push_back (0);
        a[i] += carry + (i < b.size() ? b[i] : 0);
        carry = a[i] >= base;
        if (carry)  a[i] -= base;
    }
    b.clear();
    stra.erase();
    strb.erase();
    vector<int> res;
    //вывод
    cout << a.empty() ? 0 : a.back();
    for (int i=(int)a.size()-2; i>=0; --i)
        cout << a[i];
 
    res.push_back(a.empty() ? 0 : a.back());
    for (int i=(int)a.size()-2; i>=0; --i) {
        res.push_back(a[i]);
    }
    printBigNumber(res);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2023, 16:22
Ответы с готовыми решениями:

Сложить два числа, записанные в файле
нужно создать программу которая будет находить сумму чисел, а числа в файле, разделенные пробелами или переносами строки спасибо

Сложить числа, записанные в Memo, и вывести результат в Label
Добрый день, у меня в Memo на каждой строчке записаны числа, как сложить эти цифры и вывести на label?С++ builder

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

8
Заблокирован
09.07.2023, 17:24
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
    unsigned long long a[2] = { 0,0 };
    int N, n, d;
    for (int i = 0; i < 2; i++)
    {
        cin >> N;
        for (int j = 0; j < N; j++)
        {
            cin >> n >> d;
            for (int k = 0; k < n; k++)
            {
                a[i] *= 10;
                a[i] += d;
            }
        }
    }
    unsigned long long b = *a + a[1];
    vector<pair<int, int>> v;
    pair<int, int> p = { 0,-1 };
    do
    {
        d = b % 10;
        if (d != p.second)
        {
            if (p.first)
                v.push_back(p);
            p.first = 1;
            p.second = d;
        }
        else
            p.first++;
        b /= 10;
        if (!b)
            v.push_back(p);
    } while (b);
 
    cout << v.size() << endl;
    for (int i = v.size() - 1; i >= 0; i--)
        cout << v[i].first << " " << v[i].second << endl;
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,743
Записей в блоге: 9
09.07.2023, 18:57
набросал прогу которая умеет складывать две группы одинаковой длины. Осталось разбить числа на такие группы и сложить группы попарно
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
#include <iostream>
#include <string>
using ll = long long;
 
// складывает две группы одинаковой длины len
std::string sum(ll len, int d1, int d2)
{
    int res = d1 + d2;
    auto str = std::to_string(res);
    if (d1 + d2 >= 10)
    {
        auto substr = std::to_string(len - 1) + std::string(1, char(str.back() + 1));
        str.insert(1, substr);
        bool eq = str[0] == *(str.end() - 2);
        if (eq)
        {
            substr = std::to_string(len) + std::string(1, char(str.back() + 1));
            str.replace(0, str.size() - 1, substr);
        }
        else
        {
            str = "1" + str;
        }
        str.insert(str.end() - 1, '1');
    }
    else
    {
        str = std::to_string(len) + str;
    }
    return str;
}
 
int main()
{
    ll len = 3; // длина группы (одинакова для обеих групп)
    int d1 = 5; // цифра первой группы
    int d2 = 6; // цифра второй группы
    std::cout << sum(len, d1, d2) << "\n";
}
0
0 / 0 / 0
Регистрация: 07.10.2022
Сообщений: 23
09.07.2023, 19:08  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
набросал прогу которая умеет складывать две группы одинаковой длины. Осталось разбить числа на такие группы и сложить группы попарно
а если складывать 1000 и 0001, но у Вас и и цифра фиксированная а в примерах по типу 9999999 + 1 уже будет тяжеловато идти по разрядам первого числа, пока не закончится, хотя наверно можно запустить цикл с подобными операциями и в конце нормализовать(перенести 10, в следующие разряды и так далее) число просто.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,208
09.07.2023, 23:48
Цитата Сообщение от impelix Посмотреть сообщение
Мой код у которого лимит по памяти выходит. При этом тут все минимально возможное с затратами памяти.
Это как это? Какое еще "минимально возможное"?

Я вижу у вас в коде, что "запакованные" числа читаются в память, то есть целиком "распаковываются" в исходное представление в памяти. Зачем вы это делаете? Ваша задача - выполнить сложение двух чисел. Простейшее сложение чисел - поразрядная операция, в каждый момент времени работающая только с парой соответствующих разрядов складываемых чисел. То есть на каждой итерации идет работа с единственным разрядом, который ни до этого момента, ни после этого момента никому не нужен. Операции сложения никогда не нужно видеть сразу все число. Зачем вы держите в памяти то, что никому не нужно? Поэтому никакой "распаковки" в вашей программе быть не должно.

А у вас выделаются потенциально огромные никому не нужные блоки памяти. О каком "минимально возможные" вы ведете речь? Распишите подробно ход вашей мысли, приведшей вас к выводу, что это "минимально возможные" затраты памяти.

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

Возьмем обычную тривиальную реализацию алгоритма длинного сложения: на вход приходят две последовательности цифр от младшим к старшим, на выход отправляется одна последовательность цифр

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
template <typename INPUT_IT, typename OUTPUT_IT>
OUTPUT_IT long_sum_10(INPUT_IT it_a, INPUT_IT it_a_end,
                      INPUT_IT it_b, INPUT_IT it_b_end,
                      OUTPUT_IT it_c)
{
  int carry = 0;
 
  for (; it_a != it_a_end && it_b != it_b_end; ++it_a, ++it_b)
  {
    int s = *it_a + *it_b + carry;
    *it_c++ = s % 10;
    carry = s / 10;
  }
 
  for (; it_a != it_a_end; ++it_a)
  {
    int s = *it_a + carry;
    *it_c++ = s % 10;
    carry = s / 10;
  }
 
  for (; it_b != it_b_end; ++it_b)
  {
    int s = *it_b + carry;
    *it_c++ = s % 10;
    carry = s / 10;
  }
 
  if (carry > 0)
    *it_c++ = carry;
 
  return it_c;
}
Этот алгоритм прекрасно суммирует две последовательности:
http://coliru.stacked-crooked.... a6e702cf86

Теперь напишем обертки-адаптеры для итераторов. Одна - входной итератор - будет на лету распаковывать последовательности, описанные в условии задачи и предоставлять очередную цифру. Другая - выходной итератор - будет на лету запаковывать последовательность цифр в формат, описанный в условии задачи

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
template <typename IT>
class RleInputIt
{ // Читает пары (value, count) именно в таком порядке
public:
  using iterator_category = std::input_iterator_tag;
  using difference_type = typename std::iterator_traits<IT>::difference_type;
  using value_type = int;
  using pointer = const value_type *;
  using reference = const value_type &;
 
  RleInputIt(IT it) : it(it), count(0)
    {}
 
  RleInputIt &operator ++()
  {
    if (count == 0)
      fill();
 
    assert(count > 0);
    --count;
 
    return *this;
  }
 
  RleInputIt operator ++(int)
    { RleInputIt old = *this; ++*this; return old; }
 
  reference operator *()
  { 
    if (count == 0)
      fill();
 
    assert(count > 0);
    return value; 
  }
 
  friend bool operator ==(const RleInputIt &lhs, const RleInputIt &rhs)
    { return lhs.it == rhs.it && lhs.count == rhs.count; }
  friend bool operator !=(const RleInputIt &lhs, const RleInputIt &rhs)
    { return !(lhs == rhs); }
 
private:
  IT it;
  unsigned count;
  value_type value;
 
  void fill()
  {
    assert(count == 0);
    value = *it++;
    count = *it++;
    assert(count > 0);
  }
};
 
template <typename IT>
class RleOutputIt
{ // Записывает пары (value, count) именно в таком порядке
public:
  using iterator_category = std::output_iterator_tag;
  using difference_type = typename std::iterator_traits<IT>::difference_type;
  using value_type = int;
  using pointer = const value_type *;
  using reference = const value_type &;
 
  RleOutputIt(IT it) : it(it), count(0)
    {}
 
  RleOutputIt &operator *() const
    { return const_cast<RleOutputIt &>(*this); }
 
  RleOutputIt &operator ++()
    { return *this; }
 
  RleOutputIt &operator ++(int)
    { return *this; }
 
  void operator =(value_type v)
  {
    if (count > 0 && v == value)
      ++count;
    else
    {
      if (count > 0)
        flush();
 
      assert(count == 0);
      value = v;
      count = 1;
    }
  }
 
private:
  IT it;
  unsigned count;
  value_type value;
 
  void flush()
  {
    assert(count > 0);
    *it++ = value;
    *it++ = count;
    count = 0;
  }
};
После этого, пользуясь этими адаптерами мы можем применить все тот же готовый алгоритм сложения для сложения интересующих нас последовательностей

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  using InIt = RleInputIt<std::vector<int>::const_reverse_iterator>;
  using OutIt = RleOutputIt<std::back_insert_iterator<std::vector<int>>>;
 
  std::vector<int> a { 2, 2, 3, 3, 9, 9 }, b = { 1, 1 }, c;
  OutIt it = long_sum_10(
    InIt(a.crbegin()), InIt(a.crend()), 
    InIt(b.crbegin()), InIt(b.crend()), 
    OutIt(std::back_inserter(c)));
  *it++ = 0;
  // Выводим дополнительный 0 для сброса последней накопленной последовательности
  std::reverse(c.begin(), c.end());
 
  std::copy(a.cbegin(), a.cend(), std::ostream_iterator<int>(std::cout, ""));
  std::cout << " + ";
  std::copy(b.cbegin(), b.cend(), std::ostream_iterator<int>(std::cout, ""));
  std::cout << " = ";
  std::copy(c.cbegin(), c.cend(), std::ostream_iterator<int>(std::cout, ""));
  std::cout << std::endl;
http://coliru.stacked-crooked.... 85b9a5fa0c

И никакого расхода памяти.
2
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,743
Записей в блоге: 9
10.07.2023, 02:11
вроде работает
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>
#include <string>
#include <utility>
#include <vector>
#include <algorithm>
using ll = long long;
using group = std::pair<ll, int>;
using longnumber = std::vector<group>;
 
// суммирует две группы одинаковой длины
longnumber sum(group const& g1, group const& g2)
{
    if (g1.first != g2.first)
        throw;
    auto len = g1.first;
    longnumber vres;
    int sum = g1.second + g2.second;
    if (sum >= 10)
    {
        vres.insert(vres.end(), { { 1, sum % 10 }, {1, (sum / 10) % 10} });
        if (len > 1)
        {
            vres.insert(vres.end() - 1, {len - 1, sum % 10 + 1});
        }
        if (vres[0].second == vres[1].second)
        {
            ++vres[1].first;
            vres.erase(vres.begin());
        }
    }
    else
    {
        vres.emplace_back(len, sum);
    }
    return vres;
}
 
// суммирует группу g с группой {1, 1}
longnumber addOne(group const& g)
{
    longnumber res;
    if (g.second < 9)
    {
        res.push_back({1, g.second + 1});
        res.push_back({g.first - 1, g.second});
    }
    else
    {
        res.push_back({ g.first, 0 });
        res.push_back({ 1, 1 });
    }
    return res;
}
 
int main()
{
    longnumber a = { { 1e18, 9 }, { 1e18, 3 } };                    // первое длинное число (старшие разряды в  конце вектора)
    longnumber b = { { 1, 1 },   };                 // второе длинное число
 
    // разбиваем оба числа на группы равной длины
    for (int i = 0, j = 0; i < a.size() && j < b.size(); ++i, ++j)
    {
        if (a[i].first < b[j].first)
        {
            b.insert(b.begin() + j + 1, { b[j].first - a[i].first, b[j].second });
            b[j].first = a[i].first;
        }
        else if (a[i].first > b[j].first)
        {
            a.insert(a.begin() + i + 1, { a[i].first - b[j].first, a[i].second });
            a[i].first = b[j].first;
        }
    }
    for (int i = 0; i < a.size(); ++i)
    {
        //std::cout << a[i].first << " ";
    }
    std::cout << "\n";
    for (int i = 0; i < b.size(); ++i)
    {
        //std::cout << b[i].first << " ";
    }
    std::cout << "\n\n";
 
    // суммируем группы равной длины
    longnumber res;
    int ind = 0;
    bool addCurByOne = false, addNextByOne = false;
    for (; ind < a.size() && ind < b.size(); ++ind)
    {
        longnumber c = sum(a[ind], b[ind]);
        if (c.size() > 1)
        {
            addNextByOne = true;
        }
        if (addCurByOne)
        {
            addCurByOne = false;
            longnumber added = addOne(c[0]);
            if(c[0].second == 9)
                addNextByOne = true;
            c.erase(c.begin());
            c.insert(c.begin(), added.begin(), added.end());
        }
        if (c.size() == 1)
        {
            res.push_back(c[0]);
        }
        else
        {
            res.insert(res.end(), c.begin(), c.end() - 1);
        }
        addCurByOne = addNextByOne;
        addNextByOne = false;
    }
 
    // добавляем голову более длинного числа
    auto [vmin, vmax] = std::minmax(a, b, [](auto const& a, auto const& b) {return a.size() < b.size(); });
    while (addCurByOne)
    {
        addCurByOne = false;
        if (ind < vmax.size())
        {
            longnumber added = addOne(vmax[ind]);
            if (vmax[ind].second == 9)
            {
                addNextByOne = true;
                res.insert(res.end(), added.begin(), added.end() - 1);
            }
            else
            {
                res.insert(res.end(), added.begin(), added.end());
            }
            ++ind;
        }
        else
        {
            res.push_back({1, 1});
        }
        addCurByOne = addNextByOne;
        addNextByOne = false;
    }
 
    // результат res готов. Причёсываем его.
    // удаление групп вида {0, N}
    auto it = std::remove_if(res.begin(), res.end(), [](auto const& g) {return g.first == 0; });
    res.erase(it, res.end());
 
    // мёржим соседние группы
    for (int i = 0; i < res.size() - 1; )
    {
        if (res[i].second == res[i + 1].second)
        {
            res[i].first += res[i + 1].first;
            res.erase(res.begin() + i + 1);
        }
        else
        {
            ++i;
        }
    }
 
    // вывод результата
    for (int i = 0; i < res.size(); ++i)
    {
        std::cout << res[i].first << " " << res[i].second << "\n";
    }
    
    for (; ind < vmax.size(); ++ind)
    {
        std::cout << vmax[ind].first << " " << vmax[ind].second << "\n";
    }
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,208
10.07.2023, 06:02
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
После этого, пользуясь этими адаптерами мы можем применить все тот же готовый алгоритм сложения для сложения интересующих нас последовательностей

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

C++
1
2
3
std::vector<int> a = { 2, 2, 3, 3, 9, 9 };
unsigned sum = std::accumulate(InIt(a.crbegin()), InIt(a.crend()), 0u);
std::cout << sum << std::endl;
http://coliru.stacked-crooked.... 012e27774b

Применимость в других алгоритмах несколько ограничивает то, что для целей сложения нам нужен проход от младших к старшим. А для многих других приложений проход от старших к младшим является более предпочтительным. И такую возможность, при желании, тоже можно заложить в адаптер...
0
Заблокирован
10.07.2023, 06:49
impelix, если еще актуально, далиб ссылку на задачу, чтоб с каждый чих тут на проверку не выкладывать
0
 Аватар для igorrr37
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,743
Записей в блоге: 9
10.07.2023, 11:51
Исправления связанные с переносом единицы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.07.2023, 11:51
Помогаю со студенческими работами здесь

Сложить два числа, записанные в римской системе счисления без перевода в десятичную систему счисления
Дано задание: Сложить два числа, записанные в римской системе счисления (без перевода в десятичную систему счисления). Я полагаю...

Сложить числа в формате с плавающей запятой
Сложить числа -26 И 8 в формате с плавающей запятой на ДСДК или ДСОК, разрядная сетка Кф=16. Помогите пожалуйста. За помощь с меня спасибо!

Как сложить числа в формате с плавающей запятой
Сложить числа -5 И -22 в формате с плавающей запятой на двоичном сумматоре дополнительного кода(ДСДК), разрядная сетка Кф=16. Не могу...

Сложить два 16 разрядные числа в формате с фиксированной точкой
первое -2,45 формат 5,11 второе слагаемое 0,428 формат 2,14 формат ответа/результата 4,12

Сложить значения из файла, записанные по одному на строку
Всем доброго времени суток. Есть txt файл, в котором много значений (каждое новое значение - новая строка), например 10,1 15,5 15,5 ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru