Добрый день. Необходимо переопределить операцию умножения для класса полином. сам полином задается массивом коэффициентов и может быть произвольной длины. все время проблемы с выходом индекса за границы массива. Такое ощущение, что все должно быть гораздо проще. но проще не выходит. Заранее спасибо
public class Polynom
{
public int[] coefficients;
public Polynom(params int[] coefficients)
{
this.coefficients = coefficients;
}
public static Polynom operator * (Polynom polynom1, Polynom polynom2)
{
int size = polynom1.coefficients.Length + polynom2.coefficients.Length;
int[] multiplyCoefficients = new int[size - 1];
int a = polynom1.coefficients.Length;
int b = polynom2.coefficients.Length;
int c = multiplyCoefficients.Length;
if (a>= b)
{
for (int i=0; i<multiplyCoefficients.Length; i++)
{
if ((i >= 0) && (i < b))
for (int j = 0; j <= i; j++)
{
multiplyCoefficients[i] += polynom1.coefficients[j] * polynom2.coefficients[i - j];
}
if ((i >= b) && (i < a))
for (int j = b; j <= i; j++)
{
multiplyCoefficients[i] += polynom1.coefficients[j] * polynom2.coefficients[i - j];
}
if ((i >= a) && (i < c))
for (int j = a; j <= i; j++)
{
multiplyCoefficients[i] += polynom1.coefficients[j] * polynom2.coefficients[i - j];
}
}
}
return new Polynom(multiplyCoefficients);
}
}
При перемножении старших членов получится член степени n1 + n2
, где n1
и n2
— степени многочленов-множителей. С учетом наличия свободного члена (со степенью 0) нам потребуется (n1 - 1) + (n2 - 1) + 1 = n1 + n2 - 1
ячеек.
Воспользуемся тем, что при создании массива int[]
он будет инициализирован нулями. Теперь нам нужно просто почленно перемножить всё и накопить суммы этих произведений в соответствующих ячейках массива. Тут понятно, что при перемножении членов со степенями i
и j
получается член степени i + j
. Итого получается такой простой лаконичный код:
public static Polynom operator *(Polynom polynom1, Polynom polynom2)
{
int[] coeffs = new int[polynom1.coefficients.Length + polynom2.coefficients.Length - 1];
for (int i = 0; i < polynom1.coefficients.Length; ++i)
for (int j = 0; j < polynom2.coefficients.Length; ++j)
coeffs[i + j] += polynom1.coefficients[i] * polynom2.coefficients[j];
return new Polynom(coeffs);
}
Пример использования:
var p1 = new Polynom(1, 2, 3);
var p2 = new Polynom(2, 3, 4);
var p3 = p1 * p2;
Console.WriteLine(p1);
Console.WriteLine(p2);
Console.WriteLine(p3);
Вывод:
3x^2+2x+1
4x^2+3x+2
12x^4+17x^3+16x^2+7x+2
Актуально - весь интернет проштудировал в RU сегменте и ничего не нашёл(
Имеется основной веб проект написанный на java иnet приложение на winforms
HLS работает в MediaElement, но стоит упомянуть как он работает, а именно с затыками, хотя аудио работает прекрасно, добавление VLC оставляет плохой...
Хочу понять что такое поток, может кто то видел историю которая объясняет как работает поток или может навести пример с жизни