读书人

怎样用C/C++去大数的阶乘?比如500的阶

发布时间: 2012-03-29 12:53:12 作者: rapoo

怎样用C/C++去求一个大数的阶乘?比如500的阶乘
怎样用C/C++去求一个大数的阶乘?比如500的阶乘,我写了个代码,数字小的还能求,可是大的很头疼,求不出来。听他们说好像可以把大数存放在数组里面去求,可是我不懂啊,不知怎么弄,怎么写,请高手指教。

[解决办法]
用循环啊!!!
[解决办法]
用循环啊!!!
[解决办法]
百度百科上有个例子

C/C++ code
#include <stdio.h>   #define N 5000 // modify it to hold larger number   int main(void){int n, i, j, s, up, f[N] = {0};    scanf("%d", &n);    for (i = 2, f[0] = 1; i <= n; i++)        for (j = up = 0; j < N; j++) {            s = f[j] * i + up;            f[j] = s % 10;            up = s / 10;        }    for (i = N-1; f[i] == 0; i--) ;    for (; i >= 0; i--) printf("%d", f[i]);    printf("\n");    system("pause");    return 0;}
[解决办法]
C/C++ code
#include <iostream>#include <string>#include <algorithm>using namespace std;int COMPARE(string number1, string number2) {    int i,j;    int length1 = number1.size();    int length2 = number2.size();    if(number1.size() == 0) number1 = "0";    if(number2.size() == 0) number2 = "0";    j = 0;    for(i = 0; i < length1; ++i) {        if(number1[i] == '0') ++j;        else break;    }    number1 = number1.substr(j);    j = 0;    for(i = 0; i < length2; ++i) {        if(number2[i] == '0') ++j;        else break;    }    number2 = number2.substr(j);    length1 = number1.size();    length2 = number2.size();    if(length1 > length2) {        return 1;    } else if(length1 == length2) {        if(number1.compare(number2) > 0) {            return 1;        } else if(number1.compare(number2) == 0) {            return 0;        } else {            return -1;        }    } else {        return -1;    }    return 0;}string PLUS(string number1,string number2) {    int i;    int length1 = number1.size();    int length2 = number2.size();    string result="";    reverse(number1.begin(), number1.end());    reverse(number2.begin(), number2.end());    for(i = 0; i < length1 && i < length2; i++) {        char c = (char)(number1[i] + number2[i] - 48);        result = result + c;    }    while(i < length1) {        result = result + number1[i];        ++i;    }    while(i < length2) {        result = result + number2[i];        ++i;    }    int carry = 0;    for(i = 0; i < (int)result.size(); ++i) {        int value = result[i] - 48 + carry;        result[i] = (char)(value % 10 + 48);        carry = value / 10;    }    if(carry !=0 ) {        result = result + (char)(carry + 48);    }    for(i = result.size() - 1; i >= 0; i--) {        if(result[i] != '0') break;    }    result = result.substr(0, i + 1);    reverse(result.begin(), result.end());    if(result.length() == 0) result = "0";    return result;}string MINUS(string number1,string number2) {    int i;    string result = "";    int length1 = number1.size();    int length2 = number2.size();    if(COMPARE(number2,number1) > 0) {        return "-" + MINUS(number2, number1);    }    reverse(number1.begin(),number1.end());    reverse(number2.begin(),number2.end());    for(i = 0; i < length1 && i < length2; i++) {        char c = number1[i] - number2[i] + 48;        result = result + c;    }    if(i < length1) {        for(; i < length1; i++) {            result = result + number1[i];        }    }    int carry = 0;    for(i = 0; i < (int)result.length(); i++) {        int value = result[i] - 48 + carry;        if(value < 0) {            value = value + 10;            carry = -1;        } else carry = 0;        result[i]=(char)(value + 48);    }    for(i = result.size() - 1; i >= 0; i--) {        if(result[i] != '0')break;    }    result = result.substr(0, i+1);    reverse(result.begin(), result.end());    if(result.length()==0) result = "0";    return result;}string MULTIPLY(string number1, string number2) {    int i, j;    int *iresult;    int length1 = number1.size();    int length2 = number2.size();    string result = "";    reverse(number1.begin(), number1.end());    reverse(number2.begin(), number2.end());    iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));    memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));    for(i = 0; i < length1; i++) {        for(j = 0; j < length2; j++) {            iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));        }    }    int carry = 0;    for(i = 0; i < length1 + length2; i++) {        int value = iresult[i] + carry;        iresult[i] = value % 10;        carry = value / 10;    }    for(i = length1 + length2 - 1; i >= 0; i--) {        if(iresult[i] != 0)break;    }    for(; i >= 0; i--) {        result = result + (char)(iresult[i]+48);    }    free(iresult);    if(result == "") result = "0";    return result;}string factorial(string n) {    string temp = "1";    string i;    for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1")) {        temp = MULTIPLY(temp, i);    }    return temp;}int main(void) {    cout << factorial("500") << endl;    return 0;} 

读书人网 >C语言

热点推荐