C语言中的大数(3,123)组合问题

omqzjyyz  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(110)

一个真实的的c新手在这里...已经学习了6个星期,所以idk了很多东西还没有(我们刚刚学习嵌套函数,我仍然犯新手错误无处不在...)
我得到了一个关于3部分组合的hw,并编写了适用于前两部分的代码(如(3,10)),但我发现第三部分是(3,123),当然我的代码无法处理它而不溢出
这是我写的代码

#include<stdio.h>

long long int factorial(int x)   
{   int y; 
    long long int z=1;
    for (y=1; y<=x; y++)
    {z*=y;}
    return z;
}

long long int combination(int b, int c) 
{long long int a, d, e; 
a= factorial(c);
d= factorial(c-b) * factorial(b);
e= a/d;
return e;
}

int main()
{   int draws, total;
    scanf("%d %d", &draws, &total);
    printf("%lld", combination(draws, total));
    return 0;
}

我花了2-3个小时在互联网上搜索,发现了一些东西,比如itoa(不知道那是什么...从来没有听说过),数组,字符串等,但那只是帮助存储值,对实际计算没有帮助...还有一个叫GMP的东西?尝试输入#include,但它说找不到< gmp.h>。如果它给出了这个错误,那么我很肯定我不能用它为我的hwtbhidky我们的老师给了我们这个考虑到他没有告诉我们如何解决这种巨大的数字溢出问题。哈哈。非常感谢你的帮助。

knsnq2tg

knsnq2tg1#

对于组合函数的正常使用,参数是向后的。对于一次取k的n个事物的组合,语法是comb(n,k)。为了减少所涉及的数字的大小:

c = max(k, n-k)
d = n-c
comb(n,k) = (n)(n-1)(n-2)...(n+1-c)/(d!)

示例:

comb(6,2)
c = max(2, 6-2) = 4
d = 6-4 = 2
comb(6,2) = (6·5)/(2·1) = 15

comb(123,3)
c = max(3, 123-3) = 120
d = n-c = 3
comb(123,3) = (123·122·121)/(3·2·1) = 302621

相关问题