东北灵异档案贰飞云盘:编程 x! +(x+y)! +y!

来源:百度文库 编辑:中科新闻网 时间:2024/04/28 12:54:13
C语言编程!

测试通过

long func(long x, long y)
{
long i, min = (x > y) ? y : x, max = (x == min) ? y : x;
long result = 0, r1 = 1, r2 = 1, r3 = 1;
for(i = 2; i <= min; i++)
{
r1 *= i;
r2 = r1;
}
for(i = min + 1; i <= max; i++)
{
r2 *= i;
r3 = r2;
}
for(i = max + 1; i <= x + y; i++)
{
r3 *= i;
}
result = r1 + r2 + r3;
return result;
}

void main()
{
long x, y;
scanf("%ld", &x);
scanf("%ld", &y);
printf("%ld\n", func(x, y));
}

汗~~这么简单的题目,循环语句就OK了

大家怎么都这么懒呢?

有没有考虑过超长数?!要是大于65535,long是放不下的,象100!

算阶乘用Stering公式。

 
 
 
下面的代码里,yourFactorial() 通过 factorial() 实现你提出的表达式。
你可以看到 yourFactorial() 的定义直接表达了 x! + ( x + y )! + y! 。

factorial() 运用简洁有力的递归。
返回值的类型是 long double,所以可以求 170 的阶乘(307 位数)而不溢出。
如果你改用 unsigned long,求 13 的阶乘就会导致溢出了。
 
 
 
long double factorial( int n ) {
    return n > 1 ? n * factorial( n - 1 ) : 1;
}

long double yourFactorial( int x, int y ) {
    return factorial( x ) + factorial( x + y ) + factorial( y );
}
 
 
 
值得一提的是,若用 Python 实现求阶乘的函数,
即使是求超过 10000 的阶乘(超过 35660 位数),
也不会导致溢出(限制在于硬件的储存量)。