6

我想写一个程序来评估给定整数的阶乘。

遵循基础知识,我在 java 中编写了以下代码:

long fact(int num){
if(num == 1)
 return 1;
else
 return num*fact(num-1);
}

但后来我意识到,对于许多整数输入,结果可能不是我们想要的结果,因此对于测试,直接将输入设为 100。

我的怀疑是正确的,因为我得到的结果是“0”(因为结果可能超出了 long 的范围)。

所以,我只是好奇并渴望知道如何让我的程序适用于输入<=150。

我将不胜感激任何 C 编程语言或 Java 的有效解决方案。

4

5 回答 5

13

BigInteger是您的课程。它可以存储看似任意大小的整数

    static BigInteger fact(BigInteger num) {
        if (num.equals(BigInteger.ONE))
            return BigInteger.ONE;
        else
            return num.multiply(fact(num.subtract(BigInteger.ONE)));
    }
于 2013-03-04T15:57:08.303 回答
4

如果您不是在使用简单的阶乘计算方法,那么您应该对这个问题进行一些研究。以下是计算阶乘的一些算法的一个很好的概述:http ://www.luschny.de/math/factorial/conclusions.html

但就像其他答案所暗示的那样,您当前的问题是您需要使用大量实现(例如 BigInt)而不是固定大小的整数。

于 2013-03-04T16:00:38.810 回答
3

在 C 语言中,可以使用数组来存储大数的阶乘。
我的参考:计算任意大数的阶乘,显示所有数字。这是很有帮助的帖子。
我对代码进行了一些小改动以转换为 C。

int max = 5000;
void factorial(int arr[], int n){//factorial in array
    if (!n) return;
    int carry = 0;
    int i=max-1;
    for (i=max-1; i>=0; --i){
        arr[i] = (arr[i] * n) + carry;
        carry = arr[i]/10;
        arr[i] %= 10;
    }
    factorial(arr,n-1);
}
void display(int arr[]){// to print array
    int ctr = 0;
    int i=0;
    for (i=0; i<max; i++){
        if (!ctr && arr[i])      
            ctr = 1;
        if(ctr)
            printf("%d", arr[i]);
    }
}
int main(){
    int *arr = calloc(max, sizeof(int));
    arr[max-1] = 1;
    int num = 100;
    printf("factorial of  %d is: ",num);
    factorial(arr,num);
    display(arr);
    free(arr);
    return 0;
}

它的工作量为 100!见:这里

我想给你两个更有用的帖子的链接。
1)如何处理任意大整数建议GPU MP
2)C++ 程序计算大阶乘

于 2013-03-04T15:58:43.970 回答
0

在java中,你有可以存储任意大整数的BigInteger。不幸的是,在C. 您要么必须使用第三方库,要么自己实现大整数。典型的方法是拥有一个动态分配的数组,该数组将给定数字的每个数字存储在某个数字系统中(通常选择大于 10 的基数,以便减少所需的数字总数)。

于 2013-03-04T15:58:42.323 回答
0

一个十进制(以 10 为底)数字大约需要 3.3 位(确切地说:log(10)/log(2))。100!大约是 158 位长,所以你需要 158 * 3.3 = 520 位。

C 中肯定没有内置类型可以做到这一点。如果您希望阶乘计算中的每个数字都“存在”,则需要某种形式的特殊库。

使用double会给你一个近似的结果(假设这double是一个 64 位浮点值,它与 IEEE-754 兼容,或具有类似的范围 - IEEE-754double格式将给出大约 16 个十进制数字(52 位精度,除以log(10)/log(2) 像上面一样)。我相信这个值有超过 16 位,所以你不会得到一个确切的值,但它会计算一些在 10 位或更多位内的数字.

于 2013-03-04T16:17:24.180 回答