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

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

09.07.2023, 16:22. Показов 1029. Ответов 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
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,733
Записей в блоге: 8
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 / 1819
Регистрация: 18.10.2014
Сообщений: 17,205
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
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,733
Записей в блоге: 8
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 / 1819
Регистрация: 18.10.2014
Сообщений: 17,205
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
2870 / 2017 / 991
Регистрация: 21.12.2010
Сообщений: 3,733
Записей в блоге: 8
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru