Бином Ньютона
Постановка задачи. Записать разложение бинома Ньютона (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; } } }
Пример работы программы:
Тестирование дает правильный результат для n = 0,1,2,…,19,20. Для n>20 в методе bk( ) происходит переполнение в первом цикле (хотя заметьте, что локальная переменная t объявлена типом Int64), коэффициенты разложения становятся отрицательными, чего не может быть исходя из смысла задачи.
Придумайте, как расширить область допустимых значений n.
Следующая задача имеет отношение к задачам защиты информации и состоит в нахождении наибольшего общего делителя.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
Здесь нет обработки исключений.
Согласен. Но в задаче следует лишь проверить показатель степени n (целое число от 0 до 20), это можно сделать так.