我怎样才能处理C中的溢出

时间:2013-02-16 15:04:08

标签: c overflow

我想在C中创建一个数学组合计算器。例如,5个组合2是10.即使使用unsigned long long类型,还有溢出问题发生在我的程序中。输入源是n和m。每个数字是(5 <= n,m <= 100)和(m <= n)结合。另外,我附上了我的代码。我不知道有哪种更大的类型或解决方案?请告诉我。感谢您的帮助。

#include <stdio.h>
static unsigned long long gcd(unsigned long long a, unsigned long long b)
{
if(a<b)
    return gcd(b, a);
if(b==0)
    return a;
return gcd(b, a%b);
}

int main()
{
unsigned long long n, m1, m2, i, j, temp, denominator[101] = {1,}, numerator[101] = {1,}, total_de = 1, total_nu = 1, gcd_result;

scanf("%llu %llu",&n, &m1);
m2 = n - m1;
if(m2 < m1)
{
    temp = m1;
    m1 = m2;
    m2 = m1;
}// m1 is small

denominator[0] = 1; numerator[0] = 1;
for(i=1; i<=m1; i++)
{
    denominator[i] = n--;
    numerator[i] = i;
}

for(i = 1; i<=m1; i++)
{
    for(j = 1; j<=m1; j++)
    {
        gcd_result = gcd(denominator[i], numerator[j]);
        denominator[i] /= gcd_result;
        numerator[j] /= gcd_result;
    }
}

for(i = 1; i<=m1; i++)
{
    total_de *= denominator[i];
    total_nu *= numerator[i];
}
// sometimes overflow happened
printf("%llu\n",total_de/total_nu);

return 0;
}

3 个答案:

答案 0 :(得分:4)

我建议使用允许任意精度的库,例如GMP

答案 1 :(得分:2)

处理大数字但已知最大长度的一种方法是通过数组。您可以将数字分成几部分,并将每个部分存储在一个单独的数组元素中。

另一种方法是,使用链表处理大量最初未知的长度。原理保持不变,将数字划分为较小的部分并存储在列表的单独节点中。

在任何一种情况下,您都必须编写自己的函数来处理您需要完成的算术运算。总的来说,这将是一个有趣的编程练习:)

答案 2 :(得分:0)

通过使用Pascal的三角形,我可以更有效地解决我的解决方案。不使用乘法。并且溢出问题通过整数分离数字来解决。