C# 我试图找到一个多因子的值。两个值都将除以100/98! =?
你尝试的解决方案太复杂了,我不知道从哪里开始。当您不停下来思考如何手动解决此问题时,通常会发生这种情况: 所以,问题是,什么是C# 我试图找到一个多因子的值。两个值都将除以100/98! =?,c#,C#,你尝试的解决方案太复杂了,我不知道从哪里开始。当您不停下来思考如何手动解决此问题时,通常会发生这种情况: 所以,问题是,什么是5/3!?好的,让我们把它写出来: static void Main(string[] args) { Console.WriteLine("Enter your number: "); int number= Convert.ToInt32(Console.ReadLine()); int number2
5/3!代码>?好的,让我们把它写出来:
static void Main(string[] args)
{
Console.WriteLine("Enter your number: ");
int number= Convert.ToInt32(Console.ReadLine());
int number2 = Convert.ToInt32(Console.ReadLine());
double factorial = Factorial(number,number2);
Console.WriteLine("Factorial of " + number +" / "+ number2 + " = " + factorial );
Console.ReadKey();
}
//Factorial function added
public static double Factorial(int number, int number2)
{
if (number == 1 && number2 ==1 )
{
return 1;
}
double factorial = 1;
double factorial1 = 1;
double factorial2 = 1;
for (int i = number, j = number2; i >= 1 && j >= 1; i--, j--)
{
factorial1 = (factorial * i);
factorial2 = (factorial * j);
factorial = factorial1 / factorial2;
}
return factorial;
}
哇,看起来可以简化为5*4
这里的关键观点是m!%n!=0
如果n
小于或等于m
。换句话说,m代码>总是可以被n整除因为总有一个整数r
,这样r*n!=m代码>,您不需要计算m代码>或n
要了解r
是什么,只需执行以下操作:
(5 * 4 * 3 * 2 * 1) / (3 * 2 * 1)
如果n>m
,r
为零,除非您正在寻找实数解,在这种情况下,您只需将r
计算为n!/m
然后返回1.0/r
,因为m!/n代码>=1/(n!/m!)
如何评估r
r = m * (m - 1) * (m - 2) * ... * (n + 1); // m >= n
或实数解:
public static long DivideFactorials(int m, int n)
{
if (n > m)
return 0;
var r = 1L;
for (var k = m; k > n; k--)
r *= k;
return r;
}
如果我必须保存您的尝试:
public static double DivideFactorials(int m, int n)
{
if (n > m)
return 1 / DivideFactorials(n, m);
var r = 1.0;
for (var k = m; k > n; k--)
r *= k;
return r;
}
N!/啊代码>带有N>O
:
let N=3, O=3
N! = 1*2*3
O! = 1*2*3
N! / O! = 1*2*3/(1*2*3) == 1
N!/啊代码>与N
let N=5, O=3
N! = 1*2*3*4*5
O! = 1*2*3
N! / O! == 1*2*3*4*5/(1*2*3) == 4*5 == 20
基于此,我将对问题进行如下建模:
let N=3, O=5
N! = 1*2*3
O! = 1*2*3*4*5
N! / O! == 1*2*3/(1*2*3*4*5) == 1/(4*5) == 1/20
提示,您不需要计算阶乘(如果有)。在一张纸上写下5/3!代码>并找出原因…所以。。。你有什么问题?真正的问题是什么?你所拥有的只是代码。请编辑您的问题以使其更具体。我面临的问题是,在执行此代码后,没有提交正确的答案。。数字2没有得到我想要的正确值。除以两个像100这样的阶乘数/98! =9900但输出不正确,为什么?2个不同的更容易理解-而且两者都更容易摸索,然后我的+1太好了。最后一个是工作,所以很容易理解!!!但是,如果我想m>n比?@IqramHasanRabbi这两种解决方案已经为所有情况给出了答案m>n
,m==n
或m
。在ur CALC ACT分区中给出错误。这就是为什么这段代码没有运行。@IqramHasanRabbi我的代码按原样运行。否则它将如何管理输出?如果它给您一个错误,您可能没有100%地复制或以某种方式修改它。错误说明了什么?
let N=3, O=5
N! = 1*2*3
O! = 1*2*3*4*5
N! / O! == 1*2*3/(1*2*3*4*5) == 1/(4*5) == 1/20
using System;
using System.Collections.Generic;
using System.Linq;
internal class Program
{
public static decimal CalcFactDivision(int n1, int n2)
{
// calclulate the division of a factorial by another, num1 must be >= num2
IEnumerable<int> getRemaining(int num1, int num2)
{
// special cases: div by 0 and 0 div something
if (num2 == 0)
num2 = 1; // 0! == 1
else if (num1 == 0)
return new[] { 0 };
// get all numbers that make up the factorial in one step
// I can guarantee that num1 will always be bigger then num2
// by how I call this
return Enumerable.Range(num2 + 1, num1 - num2);
}
// calculate the product of an ienumerable of ints
int product(IEnumerable<int> nums) => nums.Aggregate((a, b) => a * b);
if (n1 == n2)
return 1;
else if (n1 > n2) // use product(...) to calc
return product(getRemaining(n1, n2));
else // flip them and use 1/product(...) to calc
return (decimal)1 / product(getRemaining(n2, n1));
}
static void Main(string[] args)
{
foreach (var a in Enumerable.Range(1, 10))
Console.WriteLine($"{a}! / {10 - a}! = {CalcFactDivision(a, 10 - a)} ");
Console.ReadLine();
}
}
1! / 9! = 0,0000027557319223985890652557
2! / 8! = 0,0000496031746031746031746032
3! / 7! = 0,0011904761904761904761904762
4! / 6! = 0,0333333333333333333333333333
5! / 5! = 1
6! / 4! = 30
7! / 3! = 840
8! / 2! = 20160
9! / 1! = 362880
10! / 0! = 3628800