N的阶乘 -- (九度OJ 大整数乘法)

前言

今天下午在九度做题,又遇到了大整数乘法的问题,求n的阶乘。当n很大时,求得的结果肯定超出了unsigned long int所能表示的范围,因此需要用整型数组去模拟两个数的乘法。
具体方法写在实现代码中了

题目

题目描述:
 输入一个正整数N,输出N的阶乘。
输入:
正整数N(0<=N<=1000)
输出:
 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入:
4
5
15
样例输出:
24
120
1307674368000


AC代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX 3000
 
//存储每次阶乘运算的结果
int str[MAX];
 
void calculateFactorial(int n);
 
int main()
{
    int n;
 
    while (scanf("%d", &n) != EOF) {
        if(n == 0) {
            printf("1\n");
        } else {
            calculateFactorial(n);
        }
    }
 
    return 0;
}
 
void calculateFactorial(int n)
{
    int i, j, temp, c, len;
 
    memset(str, 0, sizeof(str));
    str[1] = 1;
 
    for (i = 2, len = 1; i <= n; i ++) { //循环与2,3,..n相乘
        for (j = 1, c = 0; j <= len; j ++) { //str数组代表一个数,模拟与i相乘
            temp = str[j] * i + c;
            str[j] = temp % 10;
            c = temp / 10;
        }
        while(c > 0)
        {
            str[j ++] = c % 10;
            c /= 10;
        }
        len = j - 1;
    }
 
    for (i = len; i >= 1; i --) {
        printf("%d", str[i]);
    }
    printf("\n");
}
/**************************************************************
    Problem: 1076
    User: wangzhengyi
    Language: C
    Result: Accepted
    Time:2150 ms
    Memory:916 kb
****************************************************************/




posted @ 2013-03-06 18:17  java程序员填空  阅读(294)  评论(0编辑  收藏  举报