Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 29.10.2016
Сообщений: 7

Задача о цепочках аминоаксидов

15.05.2021, 15:43. Показов 969. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Задача заключается в том, что генерирую себе текстовый файл FILE_1 и FILE_2 в котором есть цепочка из заглавных букв латинского алфавита, от A -> T. Количество букв может быть в диапазоне [0 , 108].
Алгоритм может за одну итерацию переставить только две буквы местами н.п. ABCD -> CBAD -> CBDA -> ...
Пишу bool функцию, которая вернёт true если из строки из FILE_1 перестановками алгоритма получится строка FILE_2.
Количество перестановок не играет роль.

Что пока придумал:

1) Проверять входные данные на одинаковые длинны строк,
уникальные буквы,
повторения уникальных букв. (false , если не совпадает)

2) Перестановка с повторениями , если не ошибаюсь , наиболее подходящий алгоритм для перебирания всех возможных
вариантов. Но при увеличении количества входных букв больше шести плата временем сильно растёт.

3) Без больших чисел не смогу реализовать 10 входных данных. Нужно использовать длинную арифметику или большие числа.

Вопрос по пунктам :
1) Всё понятно
2) Нашёл на форуме :
Code
1
2
#include <algorithm> sort(s1.begin(), s1.end());
      do {} } while(next_permutation(s1.begin(), s1.end())
3) Если входных данных 108, что лучше для больших чисел, юзать библиотеки н.п.
Какие лучше в использовании ?
GNUmp bignum library
BOOSTlibrary

или писать что-то своё ?

Пока что написал такой вариант (сорян, что ещё в main int не вынес ещё всего в функции), проблема в том, что долго обрабатывает и с огромным числом данных входных проблема. Может спецы что-нибудь мудрого посоветуете ?

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <algorithm>
#include <string>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <fstream>
#include <cstdlib>
 
using namespace std;
//Факториал числа
unsigned long long int factorial(int n){
       if (n == 1 || n == 0)
             return 1;
       return n * factorial(n - 1);
}
//Уникальные буквы общее количество
int uniqLetters(string partOfString){
    int uniqLettersCounter = 0;
    string letters = "ABCDEFGHIJKLMNOPQRST";
    cout << letters << endl;
    bool letterFound[20];
 
    //bool array initialize
    for(int i=0;i<letters.length(); i++){
        letterFound[i]=0;
    }
 
    for(int i=0; i<partOfString.length(); i++){
        for(int j=0; j<letters.length(); j++){
            if(partOfString[i] == letters[j] && letterFound[j]!=true){
                letterFound[j] = true;
                uniqLettersCounter++;
            }
 
        }
    }
    cout << "BoolArray" << endl;
    for(int i=0;i<letters.length(); i++){
        cout << letterFound[i];
    }
    cout << endl;
    return uniqLettersCounter;
}
//Повторение букв массив количества повторений каждой буквы
unsigned long long int* sameLetters(string partOfString){
    string letters = "ABCDEFGHIJKLMNOPQRST";
    unsigned long long int* sameLettersCounter = new unsigned long long int[20];
    for(int i=0;i<20; i++){
        sameLettersCounter[i]=0;
    }
 
    for(int i=0; i<partOfString.length(); i++){
        for(int j=0; j<letters.length(); j++){
            if(partOfString[i]==letters[j])
            sameLettersCounter[j]+=1;
        }
    }
 
    return sameLettersCounter;
}
//Проверка на одинковую длинну и одинаковые символы
bool firstCheckOfChains(string s1, string s2){
    unsigned long long int * pointerArS1 = sameLetters(s1);
    unsigned long long int * pointerArS2 = sameLetters(s2);
    int flag=0;
    for(int i=0;i<20;i++){
        if(pointerArS1[i] == pointerArS2[i])
            flag++;
    }
    if(flag == 20 && (s1.length()==s2.length())) return true;
    else return false;
}
//Функция которая предварительно вычитывает для каждого компьютера время выполнения итераций в секунду
int IterCount(string s1, string s2){
    bool flagFounded = false;
    unsigned long long int iterationCounter = 0; //temp
    sort(s1.begin(), s1.end());
    do {
            //cout << s1 << endl;
        iterationCounter++;
        if(s1 == s2){
            flagFounded = true;
        }
    } while(next_permutation(s1.begin(), s1.end()) && flagFounded != true);
    cout << "IterationCounter           " << iterationCounter << endl;
    cout << "Iterations in 1 [ms]       " << iterationCounter / clock() << endl;
    return iterationCounter/clock();
}
//Функция времени
unsigned long long int aproximateTime(int IterationsInOneSec, unsigned long long int swaps){
    return swaps/IterationsInOneSec;
}
//MainFunctionOfProgram
bool changePossible(string s1, string s2){
    bool flagFounded = false;
    cout << "Start permutation " << endl;
 
    sort(s1.begin(), s1.end());
    do {
    cout << s1 << endl;
        if(s1 == s2){
            flagFounded = true;
        }
    } while(next_permutation(s1.begin(), s1.end()) && flagFounded != true);
        if(flagFounded) return true;
        else return false;
}
// функция мини меню / описание
void showMenu(){
cout << "\n\n---------------------- AminoAcidsSwap ----------------------\n";
cout << "------------------------------------------------------------\n";
}
// создание амино
void writeFileAmino(){
    //создать фаил с амино кислотой
    long int i = 0;
    ofstream fout("amino.txt"); // создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt
    while(i<10){
        fout << (char)( rand() % 20 +65); // запись строки в файл
        i++;
    }
    fout.close(); // закрываем файл
}
string readFromFile(){
string AminoAcidFromFile;
    ifstream fin("amino.txt");
    if (!fin.is_open())
        cout << "Err, cant open!\n";
    else
        {
        cout << "Success!\n";
        fin >> AminoAcidFromFile;
        fin.close();
        }
    return AminoAcidFromFile;
}
 
int main()
{
    string readFromF1 = "BHOAJESSCEBHOAJESSCQ";
    string readFromF2 = "HOAJESSCBHOAJESSCEBQ";
 
    string tempAminoAcid_1 = "QHABCDFGABSQ";
    string tempAminoAcid_2 = "QGFDCBAHQABS";
 
    cout << " --- Aproximate time for user computer ---\n\n";
    cout << "     a1n            A!  "          << endl;
    cout << "   P    = -------------------"    << endl;
    cout << "     b1n   (B1)!(B2)!*...*(Bn)!"   << endl << endl;;
    unsigned long long int A_1_n = tempAminoAcid_1.length(); //65; максимально можно знаков факториала 
 
    long long unsigned int* wsk = sameLetters(tempAminoAcid_1);
    for(int i=0;i<20;i++){
        //A_1_n = A_1_n+(*wsk);
        B_1_n *= factorial((*wsk));
        //cout << *wsk << " ";
        wsk++;
 
    }
    cout << endl;
    cout << "A1N  "<<factorial( A_1_n) << endl;
    cout << "B1N  "<<B_1_n << endl;
    cout << "A1n / B1N " << endl;
    unsigned long long int FakSwaps = factorial(A_1_n)/ B_1_n;
    cout << "CombinatoricAmountSwaps    " << FakSwaps << endl << endl;
    unsigned long long int PCspeed = IterCount(tempAminoAcid_1,readFromF2);
    unsigned long long int axTime = aproximateTime(PCspeed,FakSwaps);
    cout << "axTime          [ms]       " <<axTime <<endl;
    cout << "Aproximate Time [sec]      "<< axTime/(PCspeed*1000) << endl;
 
 
 
 
    // aproximate time for user computer
//---------------------------------------------------------------------------------------------------------
//    //Files
//    writeFileAmino();
//    string AminofromFileRead = readFromFile();
//    cout << "From FILE\n\n ";
//
//    uniqLetters(AminofromFileRead);
//    //sameLetters(AminofromFileRead);
//
//
//    A_1_n = 0;
//    B_1_n = 1;
//    long long unsigned int* wsk1 = sameLetters(AminofromFileRead);
//    for(int i=0;i<20;i++){
//        A_1_n += *(wsk1);
//        B_1_n *= factorial(*(wsk1));
//        wsk1++;
//    }
//    cout << "A1N        " << factorial(A_1_n) << endl;
//    cout << "B1N        " << B_1_n << endl;
//    cout << "A1n / B1N " << endl;
//
//    unsigned long long int FakSwaps1 = factorial(A_1_n)/ B_1_n;
//    cout << "CombinatoricAmountSwaps    " << FakSwaps1 << endl;
 
 
 
    //showMenu();
 
    cout << endl;
    cout << "------------------------------------------------------------\n";
    cout << "runtime = " << clock() << "[ms]" << endl;
    system("PAUSE");
    return 0;
}
Добавлено через 2 часа 50 минут
Понял, что с большими числами надо поработать, никогда не встречался - интересно. А в данной задаче чтоб сэкономить время
лучше буду проверять на длину строк , уникальные буквы, количество повторений уникальных букв. Тогда в файлах входных смогу давать 10^8 букв и если всё будет совпадать то как ни крути, всегда можно будет составить из строки s1 строку s2 любым количеством перестановок. Кину код рабочий , если кому интересно.
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
#include <algorithm>
#include <string>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <fstream>
#include <cstdlib>
using namespace std;
//show 20 letters (acids)
void showLetters(){
    string letters = "ABCDEFGHIJKLMNOPQRST";
    for(int i=0;i<20;i++)
        cout << letters[i]<< " ";
    cout << endl;
}
//uniq letters
int uniqLetters(string partOfString){
    int uniqLettersCounter = 0;
    string letters = "ABCDEFGHIJKLMNOPQRST";
    cout << letters << endl;
    bool letterFound[20];
 
    //bool array initialize
    for(int i=0;i<letters.length(); i++){
        letterFound[i]=0;
    }
    for(int i=0; i<partOfString.length(); i++){
        for(int j=0; j<letters.length(); j++){
            if(partOfString[i] == letters[j] && letterFound[j]!=true){
                letterFound[j] = true;
                uniqLettersCounter++;
            }
        }
    }
    cout << "BoolArray" << endl;
    for(int i=0;i<letters.length(); i++){
        cout << letterFound[i];
    }
    cout << endl;
    return uniqLettersCounter;
}
//if uniq letters are repeated count them
unsigned long long int* sameLetters(string partOfString){
    string letters = "ABCDEFGHIJKLMNOPQRST";
    unsigned long long int* sameLettersCounter = new unsigned long long int[20];
    for(int i=0;i<20; i++){
        sameLettersCounter[i]=0;
    }
    for(int i=0; i<partOfString.length(); i++){
        for(int j=0; j<letters.length(); j++){
            if(partOfString[i]==letters[j])
            sameLettersCounter[j]+=1;
        }
    }
    return sameLettersCounter;
}
//check length and repeated elements
bool firstCheckOfChains(string s1, string s2){
    unsigned long long int * pointerArS1 = sameLetters(s1);
    unsigned long long int * pointerArS2 = sameLetters(s2);
    int flag=0;
    for(int i=0;i<20;i++){
        if(pointerArS1[i] == pointerArS2[i])
            flag++;
    }
    if(flag == 20 && (s1.length()==s2.length())) return true;
    else return false;
}
// show menu
void showMenu(){
cout << "\n\n---------------------- AminoAcidsSwap ----------------------\n";
cout << "\n";
cout << "------------------------------------------------------------\n";
}
// create protein chains
// condition in while for protein chains can be in range 10^8
void writeFileAmino(){
    int i = 0;
    cout << "Writing file with Amino Acid 1" << endl;
    ofstream foutAminOne("amino1.txt");
    while(i<100000000){ //10^8 range 
        foutAminOne << (char)( rand() % 20 +65);
        i++;
    }
    foutAminOne.close();
    cout << "Succes! writing File 1" << endl;
 
    int j = 0;
    cout << "Writing file with Amino Acid 2" << endl;
    ofstream foutAminTwo("amino2.txt");
    while(j<10000000){ // 10^8 range
        foutAminTwo << (char)( rand() % 20 +65);
        j++;
    }
    foutAminTwo.close();
    cout << "Succes! writing File 2" << endl << endl;
}
// read protein chain 1
string readFromFile1(){
string AminoAcidFromFile1;
    ifstream fin("amino1.txt");
    if (!fin.is_open())
        cout << "Err, cant open!\n";
    else
        {
        cout << "Success, read file1!\n";
        fin >> AminoAcidFromFile1;
        fin.close();
        }
    return AminoAcidFromFile1;
}
// read protein chain 2
string readFromFile2(){
string AminoAcidFromFile2;
    ifstream fin("amino2.txt");
    if (!fin.is_open())
        cout << "Err, cant open!\n";
    else
        {
        cout << "Success, read file2!\n";
        fin >> AminoAcidFromFile2;
        fin.close();
        }
    return AminoAcidFromFile2;
}
//MainFunctionOfProgram
bool changePossible(string s1, string s2){
 
//    string test1 = "ABCDRE";
//    string test2 = "DRABCE";
 
//    string test3 = "ABCDEF";
//    string test4 = "ABCDEF";
 
    showLetters();
    long long unsigned int* wsk1 = sameLetters(s1);
        for(int i=0;i<20;i++){
            cout << *wsk1 << " ";
            wsk1++;
        }
    cout << endl;
    long long unsigned int* wsk2 = sameLetters(s2);
        for(int i=0;i<20;i++){
            cout << *wsk2 << " ";
            wsk2++;
        }
    cout << endl << endl;;
    cout << "response from Main function :  ";
    if(firstCheckOfChains(s1,s2)){
        cout << "True\n";
        return true;
    }else {
        cout << "False\n";
        return true;
    }
}
int main()
{
    showMenu();                                         //small introduction
    writeFileAmino();                                   //recording into the file's random amino chains
    changePossible(readFromFile1(),readFromFile2());    //if it possible return true
 
 
    cout << endl;
    cout << "------------------------------------------------------------\n";
    cout << "runtime = " << clock() << "[ms]\n";
    system("PAUSE");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2021, 15:43
Ответы с готовыми решениями:

Олимпиадная задача по программированию. PascalABC.NET. Задача L. Переключение между окнами
Когда пользователь работает в операционной системе Winux, у него часто запущено несколько приложений. Каждое из приложений работает в...

Васильев C# Глава 8 задача 2 (Просьба объяснить формулировку(задача внутри)
Текст задачи Написать программу , в которой есть класс с полем, являющимся ссылкой на одномерный целочисленный массив. У класса есть...

В некотором государстве ввели компьютерный паспорт гражданина. Укажите пол гражданина и последовательность событий
Доброго времени суток,форумчане. Хотелось бы попросить помощи в решении одной задачи от умных голов. Задача: В некотором...

3
Just Do It!
 Аватар для XLAT
4211 / 2670 / 655
Регистрация: 23.09.2014
Сообщений: 9,083
Записей в блоге: 3
15.05.2021, 18:19
Цитата Сообщение от WarriorBo Посмотреть сообщение
Нужно использовать длинную арифметику
неясно откуда это следует.

Цитата Сообщение от WarriorBo Посмотреть сообщение
Пишу bool функцию, которая вернёт true если из строки из FILE_1 перестановками алгоритма получится строка FILE_2
если кол-во каждой буквы будет равно между файлами, то тогда true, иначе false и не надо никаких перестановок.
1
1 / 1 / 0
Регистрация: 29.10.2016
Сообщений: 7
15.05.2021, 19:58  [ТС]
Спасибо за ответ. Так и прикинул, что нужно считывать уникальные буквы и количество повторений этих букв и длину строк входных. Если всё ок, то true. Второй код рабочий по такому принципу.
С длинной арифметикой я прикинул решение, что я буду использовать формулу перестановки с перемещениями P = (A!)/ (b1!)*(b2!)*...*(bn!). Если входные данные могут быть 10^8 , то f(10^8) = 8,263931688⋅10 5565708 тут и пригодилась бы мне длинная арифметика.
0
736 / 702 / 110
Регистрация: 29.05.2015
Сообщений: 4,289
19.05.2021, 06:29
Цитата Сообщение от WarriorBo Посмотреть сообщение
8,263931688⋅10 5565708 тут и пригодилась бы мне длинная арифметика.
Не пригодилась бы. Атомов во Вселенной меньше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2021, 06:29
Помогаю со студенческими работами здесь

Васильев C# Глава 7 задача 8 (Просьба объяснить формулировку(задача внутри)
Текст задачи Напишите программу с классом, у которого есть текстовое поле. Значение текстовому полю присваивается при создании объекта...

Задача со строками. Задача находится на фотке, которая прикреплена к сообщению
Фотку прикрепил к сообщению. П.5.4. Правил Запрещено создавать темы с бессмысленными названиями вроде &quot;Помогите!&quot;,...

Задача целочисленного программирования. Задача на оптимизацию. Матричный метод
Здравствуйте. Преподаватель дал задачи (скриншоты прикреп.) и эти две задачи были решены компонентным методом (файлы прикреплены). Но...

Задача на перебор вариантов. Задача Л.Эйлера. Про чиновника
Задача Л.Эйлера. Некий чиновник купил лошадей и быков на сумму 1770 талеров. За каждую лошадь он уплатил по 31 талеру, а за каждого быка по...

Задача коммивояжера, TSP, задача на нахождение кратчайших путей
Здравствуйте, знаю что это наглость с моей стороны, но может кто то решал задачу коммивояжера и у него остался код. У меня просто даже идей...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru