c语言 1000的阶乘 代码

#include "stdafx.h"

int a[100000]; //保存最终运算结果的数组
int main()
{
int n; //需要求阶乘的数字
int jinwei; //进位
int weishu = 1; //位数
int temp, i, j; //temp为阶乘的任一元素与临时结果的某位的乘积结果
scanf("%d", &n); //接收阶乘次数
a[0] = 1; //将结果先初始化为1
for (i = 1; i <= n; i++) //开始阶乘,阶乘元素从2开始依次登场 (正常循环)
{
//按乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘

for (j = 1, jinwei = 0; j <= weishu; j++)
{
temp = a[j - 1] * i+jinwei ; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j - 1] = temp % 10; //更新临时结果的位上信息
jinwei = temp / 10; //看是否有进位
}
while (jinwei) //如果有进位
{
a[++weishu - 1] = jinwei % 10; //新加一位,添加信息。位数增1
jinwei /= 10; //看还能不能进位
}
}
printf("结果是:\n"); //显示结果
for (i = weishu; i >= 1; i--)
{
printf("%d", a[i - 1]);
}
}

 for (i = 1; i <= n; i++) //开始阶乘,阶乘元素从2开始依次登场   (正常循环)
    {
        //按乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘  
        for (j = 1, jinwei = 0; j <= weishu; j++)
        {
            temp = a[j - 1] * i+jinwei ; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
            a[j - 1] = temp % 10; //更新临时结果的位上信息
            jinwei = temp / 10; //看是否有进位
        }
        while (jinwei) //如果有进位
        {
            a[++weishu - 1] = jinwei % 10; //新加一位,添加信息。位数增1
            jinwei /= 10; //看还能不能进位
        }
    }

这2段代码 理解不是很透彻 麻烦能讲的更加透彻 易懂

我自己写了一个,放到了我的博客上
高精度乘法--n!
博客内有算法解析
具体代码如下:

#include <iostream>
#include <cstring> 
using namespace std;
int num[10000] = {0}, size;
int main(){
    unsigned int n; // 算n!
    cin >> n; // n要大于等于0 
    num[0] = 1;
    size = 1;
    for (int i = 2; i <= n; ++i) {
        int flag = 0;
        for (int j = 0; j < size; ++j) {
            num[j] *= i;
            num[j] += flag % 10; // 要flag的后一位 
            flag /= 10; 
            flag += num[j] / 10;
            num[j] = num[j] % 10; 
        }
        while(flag) {
            num[size++] = flag % 10;
            flag /= 10;
        }
    }
    for (int i = size-1;i >= 0;--i) {
        cout << num[i];
    }
    cout << endl;
}

感觉楼主的代码好复杂啊,你是想求1000阶乘的结果,还是想要1000阶乘的表现形式?

这是网上的答案 比较简单的 但是我不是能很透彻的理解 希望有人点明一下

普通的阶乘 for循环 到到21之后 就已经装不下了

这两个算法都是用数组储存大数,然后模拟乘法的计算

这段代码就是由于常用的数据类型中存不下这些数,所以用数组的形式来存储。因为数组的长度是可以自己定义的。现在说一下这个代码,这个运算整体上是先将一个数存到数组的最后,因为我们的乘法是从个位开始的,然后,外层循环是表示这个阶乘的因数依次与数组中的数相乘并继续存到数组中,由于一个数组单元里存一个数,前面剩下的数向前进位,所以有了2个数相乘后要依次取各位放在当前位,并向数组左侧递减,while循环是为了满足相乘的结果加上进位也许会不止一位数,要循环到把进上来的数都分别放到数组中。这时候就要在存的数前面加一个岗哨,以确定存数据的结点。楼主可以做一个个位数的高次累乘,来理解这道题。

这段代码就是由于常用的数据类型中存不下这些数,所以用数组的形式来存储。因为数组的长度是可以自己定义的。现在说一下这个代码,这个运算整体上是先将一个数存到数组的最后,因为我们的乘法是从个位开始的,然后,外层循环是表示这个阶乘的因数依次与数组中的数相乘并继续存到数组中,由于一个数组单元里存一个数,前面剩下的数向前进位,所以有了2个数相乘后要依次取各位放在当前位,并向数组左侧递减,while循环是为了满足相乘的结果加上进位也许会不止一位数,要循环到把进上来的数都分别放到数组中。这时候就要在存的数前面加一个岗哨,以确定存数据的结点。楼主可以做一个个位数的高次累乘,来理解这道题。