private void button2_Click(object sender, EventArgs e) { Mass.Clear(); newmas.Clear(); Rez.Clear(); Nn.Clear(); }
private void button1_Click(object sender, EventArgs e) { long a, n; try { a = Convert.ToInt64(textBox1.Text); n = Convert.ToInt64(textBox2.Text); } catch { return; } textBox3.Text = string.Empty; string binary_n = string.Empty; while (n > 0) { binary_n += n % 2; //Інвертований бінарний запис. n /= 2; } long Rez; if (binary_n[0] == '1') { Rez = a; } else { Rez = 1; } textBox3.Text = Rez.ToString(); for (int i = 1; i < binary_n.Length; i++) { a = a * a; if (binary_n[i] == '1') { textBox3.Text += (" * " + a); Rez *= a; } } textBox3.Text += " = " + Rez; }
// Рассчёт private void button1_Click(object sender, EventArgs e) { textBox3.Clear(); int Rez, n; // Проверка конвертации if (Int32.TryParse(textBox1.Text, out n)) { // Вызов функции из библиотеки Rez = Lib_9.Class.Summ(n, textBox3); // Вывод суммы textBox2.Text = Rez.ToString(); } // При неудачной конвертации выводим подсказку и очищаем поле else { textBox1.Clear(); MessageBox.Show("Ошибка конвертации!"); } }
override public void Build() { getAnySpanningTree(); List <List <int> > temp = DeepClone(mainA) as List <List <int> >; mainA = spanningTree; base.Build(); //into Rez mainA = temp; if (Rez.Count == 0) { return; } // getAllConflicts(); while (getAllConflicts().Count > 0) { conflictPairs = getAllConflicts(); Point conf = conflictPairs[0]; //TODO: в загальному випадку ітератор просто по конфліктним парам навряд чи гарна ідея. Але має процювати. int currentLevel = LevelOfV(Rez, conf.X); //TODO: меншого за рівнем з пари if (LevelOfV(Rez, conf.X) > LevelOfV(Rez, conf.Y)) { Rez.Insert(currentLevel + 1, new List <int>()); Rez[LevelOfV(Rez, conf.Y)].Remove(conf.Y); Rez[currentLevel + 1].Add(conf.Y); conflictPairs.Remove(conf); continue; } int t = -1; if (currentLevel > 1) { if (!hasPreOnLevel(conf.X, currentLevel - 1)) { if (Rez[currentLevel - 1].Count < h[0]) { Rez[currentLevel - 1].Add(conf.X); Rez[currentLevel].Remove(conf.X); conflictPairs.Remove(conf); //вільне місце! continue; } t = canSwitchPrev(currentLevel); if (t != -1) { // п.4. Міняємо місцями початкову вершину зі знайденого конфлікту, і вершину 𝑡. SwitchVs(t, conf.X); conflictPairs.Remove(conf); continue; } } } if (currentLevel < Rez.Count - 1) { if (!hasNextOnLevel(conf.Y, currentLevel + 1)) { if (Rez[currentLevel + 1].Count < h[0]) //або на наступному місці є вільне місце і наша вершина не має наступників на наступному місці { Rez[currentLevel + 1].Add(conf.Y); Rez[currentLevel].Remove(conf.Y); conflictPairs.Remove(conf); continue; } t = canSwitchNext(currentLevel); if (t != -1) { //п.6. Міняємо місцями кінцеву вершину зі знайденого конфлікту, і вершину 𝑡. SwitchVs(t, conf.Y); conflictPairs.Remove(conf); continue; } } } // п.7. Збільшуємо довжину впорядкування, додавши місце в упорядкування відразу за поточним. // Ставимо на нього кінцеву вершину з конфліктної пари. Rez.Insert(currentLevel + 1, new List <int>()); Rez[LevelOfV(Rez, conf.Y)].Remove(conf.Y); Rez[currentLevel + 1].Add(conf.Y); conflictPairs.Remove(conf); AddVInroFreePlaces(currentLevel); currentLevel++; AddVInroFreePlaces(currentLevel); // getAllConflicts(); } for (int i = 0; i < Rez.Count; i++) { AddVInroFreePlaces(i); } for (int i = 0; i < Rez.Count; i++) { if (Rez[i].Count == 0) { Rez.Remove(Rez[i]); } } }
//unnecessary, remove late public void BuildEuristic() { A = DeepClone(mainA) as List <List <int> >; int l = FindS(A, 1).Count; while (true) //for l0 { Rez.Clear(); List <int> index = new List <int>(); // номера вершин, которые мы занесли в упорядочение на это место hi List <int> S0 = new List <int>(); List <int> fromPrevious = new List <int>(); List <int> nessesary = new List <int>(); for (int i = 0; i < h.Count; i++) //для всех hi { if (index.Count > 0) { Rez.Add(DeepClone(index) as List <int>); } A = Remove(index); index.Clear(); if (A.Count == 0) { return; } S = FindS(A, 0); s = FindS(A, 1); int k = 0; //находим вершины, которые поставили в упорядочение на прошлом шаге, //и которые еще существуют fromPrevious = fromPreviousLevel(Rez); //вершины, которые ставить необхдимо из-за того, что на этом шаге у них заканчивается мю. nessesary = findNessesary(l, i, A); for (int j = 0; j < h[i]; j++) // не более, чем hi раз каждый раз добавляем по одной вершине { //остальное как обычно в уровневом //брать из S[0] уже нечего if ((S0.Count == 0) || (j == 0)) { if (k < S.Count) //вспомнить бы, зачем на самом деле тут k { //если еще остаслись вершины, которые можно было ставить на прошлом шаге, то ставим их //иначе, т.е. если (S0.Count == 0), ищем новые if (S0.Count == 0) { S0 = AND(S[k], s[0]); k++; } } else { break; } } if ((S0.Count > 0) || (nessesary.Count > 0) || (fromPrevious.Count > 0)) { int t; if (nessesary.Count > 0) { t = findAny(nessesary); if (index.Contains(nessesary[t])) //TODO find something better { j--; } //добавляем вершину в упорядочение else { index.Add(nessesary[t]); } //удаляем вершину с списка вершин-кандидатов nessesary.RemoveAt(t); } else { if (fromPrevious.Count > 0) { t = findAny(fromPrevious); if (index.Contains(fromPrevious[t])) //TODO find something better { j--; } //добавляем вершину в упорядочение else { index.Add(fromPrevious[t]); } //удаляем вершину с списка вершин-кандидатов fromPrevious.RemoveAt(t); } else { //было в не эвристическом //берем не рандомные, а те, которые стояли на прошлом шаге. //это не делает хуже, т.к. можно брать любые. t = findBestFitEasy(S0, Rez); //если попалась вершина, которая уже стоит на этом месте - берем следующую. //в такую ситуацию попадаем из-за того, что вершину с длительностью больше 1 //по сути представляем просто как цепочку независимых вершин. if (index.Contains(S0[t])) //TODO find something better { j--; } //добавляем вершину в упорядочение else { index.Add(S0[t]); } //удаляем вершину с списка вершин-кандидатов S0.RemoveAt(t); } } } } } if (index.Count > 0) { Rez.Add(DeepClone(index) as List <int>); A = Remove(index); } if (A.Count > 1) { Rez.Clear(); } } }
override public void Build() { A = DeepClone(mainA) as List <List <int> >; Rez.Clear(); List <int> index = new List <int>(); // номера вершин, которые мы занесли в упорядочение на это место hi List <int> S0 = new List <int>(); for (int i = 0; i < h.Count; i++) //для всех hi { if (index.Count > 0) { Rez.Add(DeepClone(index) as List <int>); } A = Remove(index); index.Clear(); if (A.Count == 0) { return; } S = FindS(A, 0); s = FindS(A, 1); int k = 0; for (int j = 0; j < h[i]; j++) // не более, чем hi раз каждый раз добавляем по одной вершине { //брать из S[0] уже нечего if ((S0.Count == 0) || (j == 0)) { if (k < S.Count) //длина искомого упорядочения не может быть больше числа вершин { //если еще остаслись вершины, которые можно было ставить на прошлом шаге, то ставим их //иначе, т.е. если (S0.Count == 0), ищем новые // if (S0.Count == 0) // { S0 = AND(S[k], s[0]); k++; // } } else { break; } } if (S0.Count > 0) { //берем не рандомные, а те, которые стояли на прошлом шаге. //это не делает хуже, т.к. можно брать любые. int t = findBestFitEasy(S0, Rez); //если попалась вершина, которая уже стоит на этом месте - берем следующую. //в такую ситуацию попадаем из-за того, что вершину с длительностью больше 1 //по сути представляем просто как цепочку независимых вершин. if (index.Contains(S0[t])) //TODO find something better { j--; } //добавляем вершину в упорядочение else { index.Add(S0[t]); } //удаляем вершину с списка вершин-кандидатов S0.RemoveAt(t); } } } if (index.Count > 0) { Rez.Add(DeepClone(index) as List <int>); A = Remove(index); } if (A.Count > 1) { Rez.Clear(); } }