Консультация № 187396
30.05.2013, 18:45
95.44 руб.
0 8 2
Уважаемые эксперты! Пожалуйста помогите:
Преподаватель сказал что не увидел функции для факториала (отдельная, вне main, с параметром).

Задача:
Вычислить
Вычисление факториала числа оформите в виде подпрограммы.



Приложение:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int n, k;
Console.Write("Введите число n:");
n = Convert.ToInt32(Console.ReadLine());
Console.Write("Введите число k:");
k = Convert.ToInt32(Console.ReadLine());

int f = 0;
int n_factor = 1;
for (int i = 1; i <n; i=i+2)
{
f = i * (i + 1);
n_factor = n_factor * f;
}
f = 0;
int k_factor = 1;
for (int j = 1; j < k; j=j+2)
{
f = j * (j+1);
k_factor = k_factor * f;
}
f = 0;
int k_n_factor = 1;
for (int l = 1; l <Math.Abs(k - n); l=l+2)
{
f = l* (l+1);
k_n_factor = k_n_factor * f;
}
double result = n_factor / (k_factor * k_n_factor);

Console.WriteLine("Результат: {0}", result);

Console.ReadKey();
}
}
}

Обсуждение

Неизвестный
30.05.2013, 19:37
общий
В принципе можно данную задачу решить через рекурсию

Соотвественно функция может выглядеть так
public int f(int n)
{
if ((n==1) || (n==0)) return 1;
return n* f(n-1);
}

Итог выглядит следующим образом, ничего лишнего

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace fact
{
class Program
{
static int f(int n)
{
if (n == 1) return 1;
return n * f(n - 1);
}
static void Main(string[] args)
{
int k;
Console.Write("Введите число n:");
k = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Результат: {0}", f(k));
Console.ReadKey();
}

}
}
Неизвестный
30.05.2013, 19:38
общий
18.07.2013, 04:31
это ответ
Здравствуйте, Ушаков Антон Сергеевич!

Вот то что получилось у меня

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace fact
{
class Program
{
static int f(int n)
{
if (n == 1) return 1;
return n * f(n - 1);
}
static void Main(string[] args)
{
int k;
Console.Write("Введите число n:");
k = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Результат: {0}", f(k));
Console.ReadKey();
}

}
}
5
Неизвестный
30.05.2013, 20:46
общий
это ответ
Здравствуйте, Ушаков Антон Сергеевич!
Код:
using System;

namespace ConsoleApplication1
{
class Program
{
static void Main (string[] args)
{
try {
Console.Write ("Введите число n:");
long n = long.Parse (Console.ReadLine ());
Console.Write ("Введите число k:");
long k = long.Parse (Console.ReadLine ());

Console.WriteLine ("1.Количество сочетаний из {0} по {1}: {2}", n, k, c (n, k));
Console.WriteLine ("2.Количество сочетаний из {0} по {1}: {2}", n, k, c2 (n, k));
} catch (Exception ex) {
Console.WriteLine ("{0}", ex.Message);
} finally {
Console.ReadKey ();
}
}

static long c (long n, long k)
{
if (n < 0 || k < 0 || n < k) {
throw new ArgumentException ("Должны выполняться следующие условия: n>=0, k>=0, n>=k");
}
long result = 1;
long t = 1;
while (n>k) {
checked {
result = result * ++k / t++;
}
}
return result;
}

static long c2 (long n, long k)
{
if (n < 0 || k < 0 || n < k) {
throw new ArgumentException ("Должны выполняться следующие условия: n>=0, k>=0, n>=k");
}
return fact (n) / fact (k) / fact (n - k);
}

static long fact (long n)
{
long result = 1;
if (n < 0) {
throw new ArgumentException ("Аргумент для факториала должен быть больше нуля");
}
while (n>1) {
checked {
result *= n--;
}
}
return result;
}
}
}


Пример работы:
Код:
Введите число n:10
Введите число k:4
1.Количество сочетаний из 10 по 4: 210
2.Количество сочетаний из 10 по 4: 210
5
давно
Старший Модератор
31795
6196
31.05.2013, 11:09
общий
Всё хорошо, но:
Цитата: Факториал
По определению полагают 0! = 1


Код:
if (n == 1) return 1;

должно быть
Код:
if (n == 0) return 1;

и контроля отрицательных чисел нет.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
31.05.2013, 16:05
общий
31.05.2013, 16:11
Не видно вашего изображения с заданием. Но, поскольку это количество сочетаний, немного изменил программу(2 способа).
Неизвестный
31.05.2013, 21:41
общий
Неизвестный
02.06.2013, 12:04
общий
public int f(int n)
{
if ((n==1) || (n==0)) return 1;
return n* f(n-1);
}

Код рабочий, так как при n=1 та же самая единица, на 1 обращение к функции меньше. Насчет контроля, можно было бы еще добавить проверку на переполнение, дабы не получать 0 в итоге при больших числах. Формулу не видел, поэтому так. Вообще, конечно при n=k функция должна выдать 1 и n не может быть меньше k.
Неизвестный
02.06.2013, 12:49
общий
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace fact
{
class Program
{
static long f(long n)
{
if (n == 0) return 1;
return n * f(n - 1);
}
static void Main(string[] args)
{
long k, n;
Console.Write("Введите число n:");
n = Convert.ToInt32(Console.ReadLine());
Console.Write("Введите число k:");
k = Convert.ToInt32(Console.ReadLine());

//проверяем входные данные
//

if ((k <= n) && (k > 0) && (n > 0))
Console.WriteLine("Результат: {0}", f(n) / (f(k) * (f(n-k))));
else Console.WriteLine("Некорректные входные данные");
Console.ReadKey();
}
}
}
Форма ответа