Задача «Бином Ньютона». Пример решения

 Бином Ньютона

Постановка задачи. Записать  разложение бинома Ньютона (1+x)n по степеням x. Коэффициент  при   xk обозначается  Cn,k , читается «биномиальный коэффициент из n по k» (или «число сочетаний из n по k»:
(1+x)n = Cn,0x0 + Cn,1x1 + Cn,2x2 +… + Cn,nxn
для натуральных степеней n.

Вариант решения. Выясняем, как вычисляются  Cn,k , и составляем программу. Формула для вычисления Cn,k:
Cn,k = n!/(k!)(n-k)!) =  (n-k+1)·…·(n-1)·n/k!
где  n! – факториал от  n, см., например, предыдущую задачу.

Обсуждение. Из школьного курса алгебры вы знаете, что:
(x+1)2=1+2x+x2
(x+1)3=1+3x+3x2+x3
т.е. мы имеем уже два теста для n=2,3.

Реализация. Придерживаясь принципа проектирования «сверху-вниз», объявим в классе Program два метода:
static string бином(int n)
static int bk(int n, int k)
Второй метод будет вычислять Cn,k , а первый – возвращать строку, биномиальное разложение. В функции Main() останется ввод n и вызов результата.

using System;
namespace БиномНьютона
{
   class Program
   {
      static void Main(string[] args)
      {
         Console.Write("Степень бинома - ");
         int n = Convert.ToInt32(Console.ReadLine());
         Console.WriteLine(бином(n));
         Console.ReadKey();
      }
 // разложение бинома по степеням х
      static string бином(int n)
      {
         string s="1 + ";
         for (int k = 1; k <= n; k++)
         s = s+ bk(n, k).ToString() + "x^" + k.ToString() + " + ";
         string s1=s.Remove(s.Length - 3);
         s= "(1+x)^"+n.ToString()+ " = "+ s1;
         return s;
      }
 // биномиальный коэффициент
      static int bk(int n, int k)
      {
         long t = 1;
         for (int i = n - k + 1; i <= n; i++)
            t = t * i;
         for (int i = 2; i <= k; i++)
            t = t / i;
         return (int)t;
      }
   }
}

Пример работы программы:

2194Тестирование дает правильный результат для n = 0,1,2,…,19,20. Для n>20 в методе bk( ) происходит переполнение в первом цикле (хотя заметьте, что локальная переменная t объявлена типом Int64), коэффициенты разложения становятся отрицательными, чего не может быть исходя из смысла задачи.

Придумайте, как расширить область допустимых значений n.

Следующая задача имеет отношение к задачам защиты информации и состоит в нахождении наибольшего общего делителя.


NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.


Помощь проекту:

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
2 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Здесь нет обработки исключений.

Важно: Вы можете поддержать проект и автора.
2
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x