Формирование матрицы 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
→ Ссылка