Формирование матрицы n×n на основе факториала и степенных преобразований
Суть задания в том, чтобы выводилась матрица размера n*n по заданной формуле.
Простыми словам, для n = 4 ответ следующий:
1 0,5 0,166666666 0,041666666666666664
1 0,25 ... ...
1 0,125 ... ...
1 0,0625 ... ...
Мой код:
using System.Text;
internal class Program
{
private static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
Console.Write("Введите порядок матрицы n: ");
int n;
n = Convert.ToInt32(Console.ReadLine());
double[,] matrix = new double[n, n];
for (int j = 0; j < n; j++)
{
int factorial = Factorial(j + 1);
matrix[0, j] = 1.0 / factorial;
}
for (int i = 1; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int factorial = Factorial(j + 1);
matrix[i, j] = 1.0 / Math.Pow(factorial, n);
}
}
static int Factorial(int number)
{
int result = 1;
for (int i = 2; i <= number; i++)
{
result *= i;
}
return result;
}
Console.WriteLine("Полученная матрица: ");
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine();
}
}
}
Ответы (2 шт):
Автор решения: Швеев Алексей
→ Ссылка
Из таблички видно, что формула элемента - 1/(x!^y), где x, y - позиция элемента в матрице.
Вы же возводите в степень n.
Т. е. простой вариант реализации алгоритма будет выглядеть как то так:
int Factorial(int value)
{
int result = 1;
for (int i = value; i > 0; i--)
result *= i;
return result;
}
Console.OutputEncoding = Encoding.UTF8;
Console.Write("Введите порядок матрицы n: ");
int n = Convert.ToInt32(Console.ReadLine());
double[,] matrix = new double[n, n];
Console.WriteLine("Полученная матрица: ");
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
matrix[i - 1, j - 1] = 1d / Math.Pow(Factorial(i), j);
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
Console.Write($"{matrix[i, j]} ");
}
Console.WriteLine();
}
Автор решения: MBo
→ Ссылка
Немножко оптимизируем.
Факториалы считаем последовательно, заполняя первую строку.
Степени - домножая предыдущую строку на первую.
double[,] matrix = new double[n, n];
matrix[0, 0] = 1.0;
for (int j = 1; j < n; j++)
{
matrix[0, j] = matrix[0, j - 1] / (j + 1);
}
for (int i = 1; i < n; i++)
{
for (int j = 0; j < n; j++)
{
matrix[i, j] = matrix[i - 1, j] * matrix[0, j];
}
}
Введите порядок матрицы n: 5
Полученная матрица:
1 0.5 0.166666666666667 0.0416666666666667 0.00833333333333333
1 0.25 0.0277777777777778 0.00173611111111111 6.94444444444444E-05
1 0.125 0.00462962962962963 7.2337962962963E-05 5.78703703703704E-07
1 0.0625 0.000771604938271605 3.01408179012346E-06 4.82253086419753E-09
1 0.03125 0.000128600823045267 1.25586741255144E-07 4.01877572016461E-11
