public static void Delete(Scalenum sc)//Уничтожение списков: {//sc - Освобождаемый класс //sc.digits.Clear(); //sc.degrees.Clear(); sc.degrees = null; sc.digits = null; }
public static void Delete(Scalenum sc) //Уничтожение списков: { //sc - Освобождаемый класс //sc.digits.Clear(); //sc.degrees.Clear(); sc.degrees = null; sc.digits = null; }
public void Insert(Scalenum s) //Вставка одного числа в центральную часть другого числа: { //s - число, которое вставляем if (s.q != q) { Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); } List digits1 = new List(); //Список ненулевых цифр результата List degrees1 = new List(); //Список соответствующих степеней результата for (int i = 0; i < digits.Length; i++) //Перебираем все цифры исходного числа { if (degrees[i] <= degrees[digits.Length - 1] / 2) // Если цифра в первой половине { digits1.Push(digits[i]); //Добавляем ее degrees1.Push(degrees[i]); if (degrees[i + 1] > degrees[degrees.Length - 1] / 2) //Если это последняя цифра в первой половине { for (int j = 0; j < s.degrees.Length; j++) //Вставляем число s { digits1.Push(s.digits[j]); degrees1.Push(s.degrees[j] + degrees[degrees.Length - 1] / 2 + 1);//Так как степень увеличивается на degrees[degrees.Count - 1] / 2 + 1 } } } else//Если цифра во второй половине { digits1.Push(digits[i]);//Добавляем ее degrees1.Push(degrees[i] + s.degrees[s.degrees.Length - 1] + 1);//Так как смещено на s.degrees[s.degrees.Count - 1] + 1 } } //digits.Clear(); digits = digits1; //Сохранение в исходный //degrees.Clear(); degrees = degrees1; //Сохранение в исходный }
public static void QMult(Scalenum sc) //Умножение числа на q: { //sc - число которое умножаем for (int i = 0; i < sc.degrees.Length; i++) { sc.degrees[i]++; } }
static void Main(string[] args) { StreamReader rd = new StreamReader("numbers.txt"); //Файл для считывания данных StreamWriter wr = new StreamWriter("result.txt"); //Файл для записи результатов int q = Visualisation.Initialize(); //Выбираем систему счисления с которой работаем Scalenum scl = new Scalenum(q); Scalenum scl1 = new Scalenum(q); int n = 0; while (n != 5) { n = Visualisation.Choice(); //Выбираем выполняемое действие if (n != 5) //Если не выбрали выход { Visualisation.Read(ref scl, rd); Visualisation.Read(ref scl1, rd); wr.WriteLine("Первое число:"); Visualisation.Write(scl, wr); wr.WriteLine("Второе число:"); Visualisation.Write(scl1, wr); switch (n)//Выполняем требуемое действие { case 1: { Scalenum s = scl + scl1; wr.WriteLine("Результат:"); Visualisation.Write(s, wr); } break; case 2: { Scalenum s = scl * scl1; wr.WriteLine("Результат:"); Visualisation.Write(s, wr); } break; case 3: { Scalenum s = scl % scl1; wr.WriteLine("Результат:"); Visualisation.Write(s, wr); } break; case 4: { scl.Insert(scl1); wr.WriteLine("Результат:"); Visualisation.Write(scl, wr); } break; } } } wr.Close(); }
public static int Decoding(Scalenum sc)//Построение числа в 10-ичной системе счисления по заданному числу в q -ичной системе: {//sc - преобразуемое число int n = 0;//Переменная для результата for (int i = 0, j = 0, q = 1; i < sc.degrees.Length; i++) { for (; j < sc.degrees[i]; j++, q *= sc.q) ; n += sc.digits[i] * q; } return n; }
public static Scalenum operator %(Scalenum s1, Scalenum s2) //Остаток двух чисел в q-ичной системе счисления: { //s1, s2 - числа в q-ичной системе счисления if (s1.q != s2.q) { Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); return(null); } Scalenum s = Functions.Coding(Functions.Decoding(s1) % Functions.Decoding(s2), s1.q);//Переменная для результата return(s); }
static void Main(string[] args) { StreamReader rd = new StreamReader("numbers.txt");//Файл для считывания данных StreamWriter wr = new StreamWriter("result.txt");//Файл для записи результатов int q = Visualisation.Initialize();//Выбираем систему счисления с которой работаем Scalenum scl = new Scalenum(q); Scalenum scl1 = new Scalenum(q); int n = 0; while (n != 5) { n = Visualisation.Choice();//Выбираем выполняемое действие if (n != 5)//Если не выбрали выход { Visualisation.Read(ref scl, rd); Visualisation.Read(ref scl1, rd); wr.WriteLine("Первое число:"); Visualisation.Write(scl, wr); wr.WriteLine("Второе число:"); Visualisation.Write(scl1, wr); switch(n)//Выполняем требуемое действие { case 1: { Scalenum s = scl + scl1; wr.WriteLine("Результат:"); Visualisation.Write(s, wr); } break; case 2: { Scalenum s = scl * scl1; wr.WriteLine("Результат:"); Visualisation.Write(s, wr); } break; case 3: { Scalenum s = scl % scl1; wr.WriteLine("Результат:"); Visualisation.Write(s, wr); } break; case 4: { scl.Insert(scl1); wr.WriteLine("Результат:"); Visualisation.Write(scl, wr); } break; } } } wr.Close(); }
public static Scalenum operator +(Scalenum s1, Scalenum s2) //Сумма двух чисел в q-ичной системе счисления: { //s1, s2 - числа в q-ичной системе счисления if (s1.q != s2.q) { Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); return(null); } Scalenum s = new Scalenum(s1.q);//Переменная для результата Functions.SumConst(ref s, Functions.Decoding(s1)); Functions.SumConst(ref s, Functions.Decoding(s2)); return(s); }
public static Scalenum Coding(int n, int q = 10)//Построение числа в q-ичной системе счисления по заданному числу в 10-тичной системе: {//n - преобразуемое число;q - основание системы счисления Scalenum s = new Scalenum(q);//Переменная для результата for (int i = 0; n != 0; i++, n /= q) { if (n % q != 0) { s.digits.Push(n % q); s.degrees.Push(i); } } return s; }
public static Scalenum Coding(int n, int q = 10) //Построение числа в q-ичной системе счисления по заданному числу в 10-тичной системе: { //n - преобразуемое число;q - основание системы счисления Scalenum s = new Scalenum(q); //Переменная для результата for (int i = 0; n != 0; i++, n /= q) { if (n % q != 0) { s.digits.Push(n % q); s.degrees.Push(i); } } return(s); }
public static int Decoding(Scalenum sc) //Построение числа в 10-ичной системе счисления по заданному числу в q -ичной системе: { //sc - преобразуемое число int n = 0; //Переменная для результата for (int i = 0, j = 0, q = 1; i < sc.degrees.Length; i++) { for (; j < sc.degrees[i]; j++, q *= sc.q) { ; } n += sc.digits[i] * q; } return(n); }
public static int MED(Scalenum sc)//Нахождение цифры, которая встречается в представлении числа максимальное число раз: {//sc - число int[] a = new int[sc.q];//Количество нахождений цифр в числе for (int i = 0; i < sc.digits.Length; i++) a[sc.digits[i]]++; a[0] = sc.degrees[sc.degrees.Length - 1]; for(int i = 1;i < sc.q;i++) a[0]-= a[i]; int max = -1, imax = -1; for(int i = 0;i < sc.q;i++) if (a[i] > max) { max = a[i]; imax = i; } return imax; }
public static Scalenum operator *(Scalenum s1, Scalenum s2) //Произведение двух чисел в q-ичной системе счисления: { //s1, s2 - числа в q-ичной системе счисления if (s1.q != s2.q) { Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); return(null); } Scalenum s = new Scalenum(s1.q); //Переменная для результата Scalenum q = new Scalenum(s1.q); //Переменная для степени q Functions.SumConst(ref q, Functions.Decoding(s1)); for (int i = 0, j = 0; i < s2.degrees.Length; i++)//Перебираем все значащие цифры во втором числе { for (; j < s2.degrees[i]; j++, Functions.QMult(q)) { ; //Доходим до нужной степени } Functions.SumConst(ref s, Functions.Decoding(q) * s2.digits[i]); //Прибавление к результату s1 * q^s2.degrees[i] * s2.digits[i] } return(s); }
public static int MED(Scalenum sc) //Нахождение цифры, которая встречается в представлении числа максимальное число раз: { //sc - число int[] a = new int[sc.q]; //Количество нахождений цифр в числе for (int i = 0; i < sc.digits.Length; i++) { a[sc.digits[i]]++; } a[0] = sc.degrees[sc.degrees.Length - 1]; for (int i = 1; i < sc.q; i++) { a[0] -= a[i]; } int max = -1, imax = -1; for (int i = 0; i < sc.q; i++) { if (a[i] > max) { max = a[i]; imax = i; } } return(imax); }
public static void SumConst(ref Scalenum sc, int n) //Увеличения числа на на константу { //sc - число;n - константа int m = Decoding(sc) + n; sc = Coding(m, sc.q); }
public static void QMult(Scalenum sc)//Умножение числа на q: {//sc - число которое умножаем for (int i = 0; i < sc.degrees.Length; i++) sc.degrees[i]++; }
public void Insert(Scalenum s)//Вставка одного числа в центральную часть другого числа: {//s - число, которое вставляем if (s.q != q) Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); List digits1 = new List();//Список ненулевых цифр результата List degrees1 = new List();//Список соответствующих степеней результата for (int i = 0; i < digits.Length; i++)//Перебираем все цифры исходного числа { if (degrees[i] <= degrees[digits.Length - 1] / 2)// Если цифра в первой половине { digits1.Push(digits[i]);//Добавляем ее degrees1.Push(degrees[i]); if (degrees[i + 1] > degrees[degrees.Length - 1] / 2)//Если это последняя цифра в первой половине { for (int j = 0; j < s.degrees.Length; j++)//Вставляем число s { digits1.Push(s.digits[j]); degrees1.Push(s.degrees[j] + degrees[degrees.Length - 1] / 2 + 1);//Так как степень увеличивается на degrees[degrees.Count - 1] / 2 + 1 } } } else//Если цифра во второй половине { digits1.Push(digits[i]);//Добавляем ее degrees1.Push(degrees[i] + s.degrees[s.degrees.Length - 1] + 1);//Так как смещено на s.degrees[s.degrees.Count - 1] + 1 } } //digits.Clear(); digits = digits1;//Сохранение в исходный //degrees.Clear(); degrees = degrees1;//Сохранение в исходный }
public static Scalenum operator *(Scalenum s1, Scalenum s2)//Произведение двух чисел в q-ичной системе счисления: {//s1, s2 - числа в q-ичной системе счисления if (s1.q != s2.q) { Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); return null; } Scalenum s = new Scalenum(s1.q);//Переменная для результата Scalenum q = new Scalenum(s1.q);//Переменная для степени q Functions.SumConst(ref q, Functions.Decoding(s1)); for (int i = 0, j = 0; i < s2.degrees.Length; i++)//Перебираем все значащие цифры во втором числе { for (; j < s2.degrees[i]; j++, Functions.QMult(q)) ;//Доходим до нужной степени Functions.SumConst(ref s, Functions.Decoding(q) * s2.digits[i]);//Прибавление к результату s1 * q^s2.degrees[i] * s2.digits[i] } return s; }
public static Scalenum operator +(Scalenum s1, Scalenum s2)//Сумма двух чисел в q-ичной системе счисления: {//s1, s2 - числа в q-ичной системе счисления if (s1.q != s2.q) { Console.WriteLine("Числа должны иметь одинаковое основание системы счисления."); return null; } Scalenum s = new Scalenum(s1.q);//Переменная для результата Functions.SumConst(ref s, Functions.Decoding(s1)); Functions.SumConst(ref s, Functions.Decoding(s2)); return s; }
public static void SumConst(ref Scalenum sc, int n)//Увеличения числа на на константу {//sc - число;n - константа int m = Decoding(sc) + n; sc = Coding(m, sc.q); }
public static void Write(Scalenum sc, StreamWriter wr) //Вывод данных о числе { //sc - число;wr - файловый поток в который записываем wr.WriteLine("Представление числа в десятичной системе:" + Functions.Decoding(sc)); //10-ичная система счисления wr.WriteLine("Представление числа в q-ичной системе счисления:\r\n" + sc.ToString()); //q-ичная система счисления }
public static void Write(Scalenum sc, StreamWriter wr)//Вывод данных о числе {//sc - число;wr - файловый поток в который записываем wr.WriteLine("Представление числа в десятичной системе:" + Functions.Decoding(sc));//10-ичная система счисления wr.WriteLine("Представление числа в q-ичной системе счисления:\r\n" + sc.ToString());//q-ичная система счисления }
public static void Read(ref Scalenum sc, StreamReader rd) //Считывание числа из файла: { //sc - число в которое считываем;rd - файловый поток откуда считываем sc = Functions.Coding(int.Parse(rd.ReadLine()), sc.q); }
public static void Read(ref Scalenum sc, StreamReader rd)//Считывание числа из файла: {//sc - число в которое считываем;rd - файловый поток откуда считываем sc = Functions.Coding(int.Parse(rd.ReadLine()), sc.q); }