2016-06-07 57 views
-1

我试图运行一个程序,对大数的阶乘进行某些操作(比如说50!;即3.041e + 64 - 巨大!),因此不适合在我知道的正常int数据类型中(无符号long long int等)在C程序中使用适当的数据类型

我使用哪种数据类型来存储这些值?

P.S我试图在阶乘中查找尾随零。以下是我的方法:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int FactorialFinder(int a) 
{ 
    if (a>1) 
    a= a* (FactorialFinder(a-1)) ; 

    return a; 
} 


int main() 
{ 
    printf("Enter number \n"); 
    int num ; 
    scanf("%d",&num) ; 
    printf("number is %d\n",num); 

    printf("Factorial is %d",(num = FactorialFinder(num))) ; 

int x=0, count = 0 ; 

while(num>0) 
{ 
    x = (num%10) ; 
    if (x == 0) 
     count++ ; 
    else 
     break; 

    num= num/10 ; 
} 

printf("\nNumber of trailing zeroes is %d",count) ; 
getchar() ; 
return 0; 
} 

工作正常12!结果是错误的(从17!它开始返回负因子值(?),从34!它给0)我猜是由于数据类型问题。有人可以帮我吗?

+3

'n!'的小数表示形式中的尾随零数由factorial中的'5'的因子数决定。你不需要计算完整的阶乘。 – EOF

+0

你可以用一个bignum库蛮力,但如果你从这个地方得到更多的问题,用bignum实现朴素的算法不太可能解决你所有的问题。 – user2357112

+0

@EOF我知道这种方法,这就是为什么我没有要求解决方案。有没有使用我的方法的方法? –

回答

1

那么这些类型的数字不能按照您推理的方式正确存储为单个数字没有数据类型来存储它们。使用大数字的最佳方法是将它们存储为int类型或char类型的数组。

例如可以存储1234567898765作为数组int big[14]其中,

big[0]=1 
big[1]=2 
. 
. 
. 
big[13]=5 //last element 
big[14]=-1 //to mark the end of number... 

或与-1作为最后元件以相反的顺序(选择哪个是方便的实现)


现在来到了具有挑战性的部分,你必须创建你需要的加法,减法,乘法和其他操作的功能。有很多方法来实现这些功能..试试看..或者你可以查找如何在这里做他们的一个来源:click

这提供了高达100个的数字,但是你可以尝试建立一个能够处理更大的数字:)

算术数字的实现