大数的阶乘运算

#include <iostream>  
using namespace std;  
int main()  
{  
    int n,i,j;  
    while (cin>>n)  
    {  
        int flag=1;          //当前阶乘答案的位数 (进位:需要进几位 例99*100 则需要进两位)
        int carry=0;        //用来储存每一次未存进去的数 例如24 存4进去 carry=24/10=2 留到下一次相加后存
        int res=0;          //用来读取每位数(从个位开始)乘以当前的阶乘数 并对它进行处理后存储
        int str[40000];     //根据题目要求设置数组的大小  
        str[0]=1;  
        for (i=2;i<=n;i++)   //从2开始计算阶乘  
        {  
            for (j=1;j<=flag;j++)     //根据进位flag大小来判断当前阶乘结果的的位数  
             {  
            res=str[j-1]*i+carry;  
            str[j-1]=res%10;  
            carry=res/10;  
                      }  
            while (carry)  //当进位大于一时将结果扩展到下一位  
            {  
                flag++;  
                str[flag-1]=carry%10;  
                 carry/=10;  
            }  
        }  
        for (i=flag-1;i>=0;i--)    //将结果数组倒序输出,注意最后一位是"i=flag-1",因为"flag=1" 对应str[0],以此类推  
        {  
             cout<<str[i];  
        }  
         cout<<endl;  
     }  
    return 0;  
}   //res=0 str[0]=1 carry =0 flag=1
    //res=2 str[0]=2 carry=0
    //res=6 str[0]=6 carry=0
    //i=4 res=24 str[0]=4 carry=2 flag=2 str[1]=2 carry=0
    // i=5 res=20 str[0]=0 carry=2 res=12 str[1]=2 carry=1 flag=3 str[2]=1 carry=0

猜你喜欢

转载自blog.csdn.net/qq_41660465/article/details/79226407