Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Проверить результат умножения матриц

31.03.2017, 18:31. Показов 2833. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Снова решил сдать задачу на сайте Дистанционная подготовка. Но программа не проходит по времени. Помогите, пожалуйста, оптимизировать код, если это возможно.
Вот ссылка на задачу: http://informatics.mccme.ru/mo... rid=1303#1

Ниже мой код:

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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int N, sum;
    bool p;
    do
    {
        fin >> N;
        int A[N][N], B[N][N], C[N][N], D[N][N];
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                fin >> A[i][j];
            }
        }
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                fin >> B[i][j];
            }
        }
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                fin >> D[i][j];
            }
        }
        p = true;
        for (int j = 0; j < N; j++)
        {
            for (int i = 0; i < N; i++)
            {
                sum = 0;
                for (int r = 0; r < N; r++)
                {
                    sum += A[j][r] * B[r][i];
                }
                C[j][i] = sum;
                if (C[j][i] != D[j][i])
                {
                    p = false;
                    break;
                } 
            }
        }
        if (N == 0)
            break;
        if (p)
            fout << "YES" << endl;
        else
            fout << "NO" << endl;
    } while (N != 0);
    fin.close();
    fout.close();
    system("pause");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2017, 18:31
Ответы с готовыми решениями:

Функция умножения матриц
Так получилось , что я решила перейти в другой вуз на другую специальность. Программирование - это не мое . Но нужно сдать сессию , а на...

Скорость умножения матриц
Всем привет. Решил написать 2 метода умножения матриц, и проверить скорость их выполнения. Имеем класс Mat4 в котором данные описаны...

Подпрограмма умножения 2 матриц
#include&lt;iostream.h&gt; const int N=20;const int M=25; double m,l,n; void d(double x,double y,double z) void main () { int i,j; ...

22
14 / 14 / 14
Регистрация: 15.08.2016
Сообщений: 52
31.03.2017, 20:56
Как вы вообще умудрились создать статический массив, указывая в количестве элементов переменную, а не константу?
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
31.03.2017, 21:26  [ТС]
Reidak, Спасибо за ваш ответ. Я объявлю его как динамический, если это ускорит скорость выполнения программы. Вы могли бы как-то помочь с оптимизацией? Код выполняется, но не проходит по времени
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
01.04.2017, 11:26
Fixer_84, не пойму для чего строка 47. Мне кажется что она лишняя. Вместо sum в 42,45 строка сразу использовать C[j][i].
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
01.04.2017, 11:43
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Я объявлю его как динамический, если это ускорит скорость выполнения программы.
это не ускорит, такой код вообще по стандарту запрещен.
C++
1
2
fin >> N;
int A[N][N], B[N][N], C[N][N], D[N][N];
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
01.04.2017, 17:21
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
// До main вот эти два объявления
const size_t MAX_SIZE = 500;
 
// Мы выделили память один раз, теперь на это не будет тратиться время.
// Будет быстрее, так как у тебя память выделяется при каждом прохождении цикла.
int A[MAX_SIZE][MAX_SIZE], B[MAX_SIZE][MAX_SIZE], C[MAX_SIZE][MAX_SIZE];
 
int main(){
///..... Пропуск, включая ввод
 
Проверка результата:
 
if (0==N)
   break;
bool fl = true;
for (size_t i = 0; fl && i<N; ++i){
   for(size_t j = 0; fl && j<N; ++j){
      int sum = 0;
      for(size_t k = 0; k<N;++k){
            sum+=A[i][k]*B[k][j];
      }
      if (sum!=C[i][j]){
            fl = false; // За счёт этого сразу выходим из всех циклов (внимательно посмотри на условие в цикле for)
      }
   }
}
 
fout<<(fl? "YES":"NO")<<endl;
 
}while(N);
////
Добавлено через 4 минуты
Если у тебя компилировалось то, что ты написал, то у тебя была проблема с излишним выделением памяти при каждой итерации большого цикла.

Плюс, ты при нахождении несоответствия выходил только из цикла перебора j, хотя можно сразу вывод делать.
1
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
01.04.2017, 19:09
Цитата Сообщение от Fixer_84 Посмотреть сообщение
не проходит по времени
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int N;
    while (true)
    {
        fin >> N;
        if (!N)
        {
            return 0;
        }
        int A[N][N], B[N][N], C[N][N], D[N][N];
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                fin >> A[i][j];
            }
        }
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                fin >> B[i][j];
            }
        }
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                fin >> D[i][j];
            }
        }
        for (int j = 0; j < N; j++)
        {
            for (int i = 0; i < N; i++)
            {
                for (int r = 0; r < N; r++)
                {
                    C[j][i] += A[j][r] * B[r][i];
                }
                if (C[j][i] != D[j][i])
                {
                    fout << "NO" << endl;
                    continue;
                }
            }
        }
        fout << "YES" << endl;
    }
    fin.close();
    fout.close();
}
Такое тоже не пройдет, хотя куда более оптимизировано.
1.Можно попробовать на чистом Си, fscanf читает быстрее cin, fprintf печатает куда быстрее fout.
2.Есть некая вероятность,что задачка поучительная и нужно изучить вот это - http://www.algolib.narod.ru/Math/Matrix.html

Добавлено через 1 час 5 минут
Код выше неверен. 51 строчка делает не то что задумывалось, не заметил, что в двух циклах сижу. И правда нужна лишняя переменная на проверку.

Добавлено через 4 минуты
Код на Си, как и ожидалось, превышает как минимум на 0.04. И это с goto.
Видимо, вам все-таки придется разбираться с другими алгоритмами перемножения, которые имеют меньшую сложность.
Или дождаться более опытных людей.
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <malloc.h>
#include <string.h>
 
void allocate_memory(int ***to_allocate, const size_t CAPACITY);
int main(void)
{
    FILE *input_file = fopen("inз.txt", "r");
    FILE *output_file = fopen("output.txt", "w");
 
    size_t QUANTITY;
    while (1)
    {
        metka : 
        fscanf(input_file,"%d", &QUANTITY);
        if (!QUANTITY)
        {
            fclose(input_file);
            fclose(output_file);
            return 0;
        }
 
        int **second_array= NULL;
        int **first_array = NULL;
        int **result_array = NULL;
        int **true_result = NULL;
        allocate_memory(&second_array, QUANTITY);
        allocate_memory(&first_array, QUANTITY);
        allocate_memory(&result_array, QUANTITY);
        allocate_memory(&true_result, QUANTITY);
        
 
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                fscanf(input_file, "%d", &first_array[counter][detector]);
            }
        }
        print(first_array, QUANTITY);
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                fscanf(input_file, "%d", &second_array[counter][detector]);
            }
        }
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                fscanf(input_file, "%d", &result_array[counter][detector]);
            }
        }
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                true_result[counter][detector] = 0;
                for (size_t calculator = 0; calculator < QUANTITY; calculator++)
                {
                    true_result[counter][detector] += first_array[counter][calculator] * second_array[calculator][detector];
                }
                if (true_result[counter][detector] != result_array[counter][detector])
                {
                    fprintf(output_file, "NO\n");
                    goto metka;
                }
            }
        }
        fprintf(output_file, "YES\n");
    }
}
 
 
void allocate_memory(int ***to_allocate, const size_t CAPACITY)
{
        *to_allocate = (int **)malloc(CAPACITY * sizeof(int*));
        for (size_t detector = 0; detector < CAPACITY; detector++)
        {
            (*to_allocate)[detector] = (int*) malloc(sizeof(int) * CAPACITY);
        }
}
Добавлено через 10 минут
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Код выполняется
Да, вот это самое странное. Есть некая вероятность, что он все же не выполняется, если вы пытаетесь сделать динамический массив через статику.
У меня такое не компилируется в VS, сразу вылетает в QT.
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
03.04.2017, 19:40  [ТС]
Notoriously, спасибо за ваш ответ. Нет, на сайте "Дистанционная подготовка" другие подобные объявления проходят и тесты засчитывают. Проверено при отправке других задач. Я знаю, что это не совсем правильно. Просто, когда начинал программировать, ничего не знал про динамические массивы, да и к тому же, в Dev-Cpp все работает. А в Visual Studio я почти не сижу, только когда в Windows Forms что-нибудь делаю. Вообщем, спасибо всем, кто откликнулся или еще откликнется. Буду учиться дальше.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.04.2017, 19:47
Цитата Сообщение от Fixer_84 Посмотреть сообщение
на сайте "Дистанционная подготовка" другие подобные объявления проходят
потому что там используют gcc, у которого по дефолту есть расширение variable length arrays.
но стоит ввести ключик -pedantic-errors и выдаст ошибку компиляции.
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
03.04.2017, 19:47
Fixer_84, а время считывания массива в файл входит в контрольное время или туда входит только время перемножения матриц?
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
03.04.2017, 22:04  [ТС]
мановар, здравствуйте! К сожалению, не знаю. Просто в единственном тесте (там всего один тест) сказано, что превышено время выполнения программы. У меня такое уже было, и стоило найти более оптимальный алгоритм и программы засчитывали. Просто, про настоящую оптимизацию почти ничего не знаю. А в этой программе старался использовать как можно меньше вложенных циклов, но это только лишь чуть-чуть прибавило скорости.
1
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
03.04.2017, 23:44
мановар,
Входит всё.
Но у меня довольно большой опыт общения с этим сайтом, более чем уверен, что , как я уже говорил нужно использовать алгоритм с меньшей сложностью. Быстрее считать файл вы не сможете. Да и если сможете, не поможет это.
Тут n^3, как не бейтесь. Есть алгоритмы на n^(2+E). Они "должны пройти". Ссылка на их реализацию также лежит выше.
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
04.04.2017, 01:18
Цитата Сообщение от Notoriously Посмотреть сообщение
как я уже говорил нужно использовать алгоритм с меньшей сложностью
А кто сказал, что данные алгоритмы при заданных условиях будут выполняться быстрее?
А практически уверен, что достаточно кода, предложенного товарищем New man.

Цитата Сообщение от Notoriously Посмотреть сообщение
1.Можно попробовать на чистом Си, fscanf читает быстрее cin, fprintf печатает куда быстрее fout.
Обычно эта проблема решается использованием
C++
1
ios_base::sync_with_stdio(false);
(чтобы не городить кучу мерзкого Си-кода).
2
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
04.04.2017, 07:31
Цитата Сообщение от Notoriously Посмотреть сообщение
Быстрее считать файл вы не сможете.
Вот в этом то и проблема. Создал матрицу 500 x 500. Одну ее считывает около 5.5 секунд, а что уж говорить про считывание остальных двух, их перемножения и сравнение.
0
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
04.04.2017, 15:19
Цитата Сообщение от nonedark2008 Посмотреть сообщение
практически уверен
Если вы про этот код (код New man)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
 
constexpr size_t MAX_SIZE = 500;
 
 
int first[MAX_SIZE][MAX_SIZE], second[MAX_SIZE][MAX_SIZE], result[MAX_SIZE][MAX_SIZE];
 
inline void get_matrix(std :: ifstream &input, const size_t DIMENSION ,int array[][MAX_SIZE]);
int main()
{
    std::ifstream input_file("in.txt");
    std::ofstream output_file("output.txt");
    int DIMENSION;
    do
    {
        input_file >> DIMENSION;
        if (!DIMENSION)
        {
            return 0;
        }
        get_matrix(input_file, DIMENSION, first);
        get_matrix(input_file, DIMENSION, second);
        get_matrix(input_file, DIMENSION, result);
 
        bool flag = true;
        for (auto counter = 0; flag && counter < DIMENSION; counter++)
        {
            for (auto detector = 0; flag && detector < DIMENSION; detector++)
            {
                auto sum = 0;
                for (auto calculator = 0; calculator < DIMENSION; calculator++)
                {
                    sum += first[counter][calculator] * second[calculator][detector];
                }
                if (sum != result[counter][detector])
                {
                    flag = false;
                }
            }
        }
        output_file << (flag ? "YES" : "NO") << std :: endl;
 
    } while (true);
}
 
void get_matrix(std::ifstream &input, const size_t DIMENSION, int array[][MAX_SIZE])
{
    for (auto counter = 0; counter < DIMENSION; counter++)
    {
        for (auto detector = 0; detector < DIMENSION; detector++)
        {
            input >> array[counter][detector];
        }
    }
}

То нет, он по времени даже хуже "ужасного Сишного".
Изначальный вариант - 0.808
Сишный вариант - 0.794
Вариант New man - 0.805

Добавлено через 1 минуту
Цитата Сообщение от nonedark2008 Посмотреть сообщение
решается использованием
Спасибо, с такими тонкостями еще не знаком.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
04.04.2017, 15:32
Очевидно, что iostream медленнее. Но не сильно.

Самую главную идею моего варианта: выделение памяти один раз и переиспользование, у тебя нет. Более того, ты постоянно выделяешь память, не чистя старую, поэтому может случиться переполнение.
0
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
04.04.2017, 15:36
Цитата Сообщение от New man Посмотреть сообщение
главную идею моего варианта

Не по теме:

Проблема в том,что eJudge плевать на это хотел.
У него не будет переполнения, так как ограничение по памяти там на 64 мб.
И ему все равно, выделяется ли память один раз или на каждом тесте.
Такие вот пироги. Его интересует только алгоритм, на сколько я могу судить из моих попыток сдачи разных вариантов.

0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
04.04.2017, 15:49
Notoriously, затести этот вариант. Я, конечно, никогда не писал на C, но, думаю, это будет ещё быстрее.

Кликните здесь для просмотра всего текста
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <malloc.h>
#include <string.h>
 
void allocate_memory(int ***to_allocate, const size_t CAPACITY);
int main(void)
{
    FILE *input_file = fopen("inз.txt", "r");
    FILE *output_file = fopen("output.txt", "w");
 
 
    size_t MAX_SIZE = 500;
    int **second_array= NULL;
    int **first_array = NULL;
    int **result_array = NULL;
    allocate_memory(&second_array, MAX_SIZE);
    allocate_memory(&first_array, MAX_SIZE);
    allocate_memory(&result_array, MAX_SIZE);
    size_t QUANTITY;
    while (1)
    {
        metka : 
        fscanf(input_file,"%d", &QUANTITY);
        if (!QUANTITY)
        {
            fclose(input_file);
            fclose(output_file);
            return 0;
        }
 
 
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                fscanf(input_file, "%d", &first_array[counter][detector]);
            }
        }
        print(first_array, QUANTITY);
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                fscanf(input_file, "%d", &second_array[counter][detector]);
            }
        }
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                fscanf(input_file, "%d", &result_array[counter][detector]);
            }
        }
        for (size_t counter = 0; counter < QUANTITY; counter++)
        {
            for (size_t detector = 0; detector < QUANTITY; detector++)
            {
                int res = 0;
                for (size_t calculator = 0; calculator < QUANTITY; calculator++)
                {
                    res += first_array[counter][calculator] * second_array[calculator][detector];
                }
                if (res != result_array[counter][detector])
                {
                    fprintf(output_file, "NO\n");
                    goto metka;
                }
            }
        }
        fprintf(output_file, "YES\n");
    }
}
 
 
void allocate_memory(int ***to_allocate, const size_t CAPACITY)
{
        *to_allocate = (int **)malloc(CAPACITY * sizeof(int*));
        for (size_t detector = 0; detector < CAPACITY; detector++)
        {
            (*to_allocate)[detector] = (int*) malloc(sizeof(int) * CAPACITY);
        }
}


Добавлено через 11 минут
Цитата Сообщение от Notoriously Посмотреть сообщение
И ему все равно, выделяется ли память один раз или на каждом тесте.
Любой алгоритм состоит из операций. Операция выделения памяти квадратична от размера, так что не думаю, что ей стоит пренебрегать. Это же, блин, обычный паттерн "пул объектов", его много где, где важна производительность, применяют.

А вообще, думается мне, что нужно при чтении третьего массива сразу проверять его корректность, а при нахождении ошибки прыгнуть в его конец с помощью fseek и не тратить время на чтение и парсинг всей матрицы.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
04.04.2017, 17:06
Цитата Сообщение от New man Посмотреть сообщение
Я, конечно, никогда не писал на C, но, думаю, это будет ещё быстрее.
Еще неплохой вариант, переделать все двумерные массивы в одномерные. Это должно уменьшить кол-во кэш-промахов.
При этом можно множество двойных циклов заменить на одинарные.

New man, за goto metka; я бы тебя проклял.
0
04.04.2017, 17:08

Не по теме:

nonedark2008,
Тогда уж меня, это мой же код только с "единоразовым" выделением памяти.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2017, 17:08
Помогаю со студенческими работами здесь

Написать функцию умножения матриц
Условие : даны 3 матрицы . Определить функцию которая перемножит 2 матрицы. С помощью неё произвести умножение трех данных матриц. ...

Оптимизация умножения матриц 4x4
Есть код - умножение двух матриц размером 4x4 void mat_multiply(float *matrix, float *a, float *b) { float result; for...

Алгоритм умножения прямоугольных матриц
написать алгоритм умножения прямоугольных матриц, известна только размерность

Рекурсивная процедура умножения матриц
Вот мне задали написать рекурсивную процедуру для умножения матриц. Я понимаю, что значит написать процедуру умножения матриц, но что...

Исправить программу для умножения матриц
Привет. Создал программу для умножения матриц, используя метод Виноград. Вот что получилось #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru