首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

100的阶乘有关问题

2012-12-30 
100的阶乘问题求解,为什么结果为0,什么事溢出,怎么就会溢出,怎么解决?我刚学习C语言,希望多多关照![解决办

100的阶乘问题
100的阶乘有关问题
求解,为什么结果为0,什么事溢出,怎么就会溢出,怎么解决?我刚学习C语言,希望多多关照!
[解决办法]
溢出就是开辟的空间已经不够用了,不能够存放你要表示的数了。
int型的数据最大能表示2的16次方减1,100的阶乘都比这个数大了,肯定不能用int来保存了。
你可以搜下大数处理。
[解决办法]
100的阶乘超过了int类型数的最大值,造成数据溢出,所以结果为0
[解决办法]
每次输出a的值看看,像这样:
int a = 1, b = 2;
while (b <= 100)
{
   a = a * b;
   b++;
   printf("%d\n", a);
}


100的阶乘法要用高精度了,即用数组来模拟。
[解决办法]
求100的阶乘有一个比较简单的办法就是将int类型改为double类型
[解决办法]
修改数据类型,扩大范围就行了
[解决办法]
你搜一下   大数阶乘,很多人专门研究这个
[解决办法]
不知道这个算不算答案 
#include "stdio.h"
int main()
{
double a=1;
int b=2;
while(b<=100)
{
a=a*b;
b++;
}
printf("%g\n",a);

getchar ();
return 0;
}
[解决办法]
我觉得这样的数据范围肯定是用高精度来计算了,如果楼主需要的话,我可以发代码
[解决办法]

#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("100") << endl;
    return 0;
}


[解决办法]
黄国瑜的数据结构书,c语言版里面,有一小节讲了一下大数的阶乘是用字符数组实现的。网上有pdf文档
[解决办法]
溢出,提示就是不要用int存,用string模拟整数,这个大数问题一般每个人编程经历都会经历,你可以自己尝试写下,看看思路,自己实现下。
[解决办法]
int的-32768-32767,而100的阶乘远远大于这个数。
[解决办法]
用%e来输出 ...

热点排行