杭电 1042【N的阶乘】

N!

Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

Input
One N in one line, process to the end of file.
 
Output
For each N, output N! in one line.
 
Sample Input
  
  
1 2 3

Sample Output
  
  
1 2 6
/*
*求N!,即求N的阶乘,N最大为10000,大数求积
*(他人代码借鉴所得)
*/
#include<iostream>
using namespace std;
int main()
{
	//数组a中存放相乘的结果,设为100000位
	int a[100000];
	//n中负责接收需进行阶乘的数字,i,j,k为方便运算而使用的变量
    int i,j,k,b,c,n;
	//使用while循环,进行循环运算,当n有输入且n大于等于0时循环继续
    while(cin>>n&&n>=0)
    {
		//每次运算前通过memset函数对数组a清零处理
        memset(a,0,100000*sizeof(int));
		//a[0]作为底数需要赋值为1,以便于之后的运算以及n等于0的情况
		//k负责记录目前乘积结果的最大位数,因此每次运算前也要赋值为1
        a[0]=1;k=1;
		//当n为0或1时阶乘的结果都是1,所以当n大于1时采用n以内的for循环进行阶乘运算
        for(i=2;i<=n;i++)
        {
			//用于进位运算的变量n每一次乘法前都要清零处理
            c=0;
			//在最高位k以内进行乘法运算
            for(j=0;j<k;j++)
            {
				//b作为运算中间值寄存器使用
                b=a[j]*i+c;
				//每一次单步运算后都要进行进位处理,所进位数存放在c中,如上一步所示,下一次for循环中在下一位参与运算
                a[j]=b%10;
                c=b/10;
            }
			//for循环完毕后如最高位仍有进位,通过while循环进行持续进位处理,直到再无进位
            while(c)
            {
				//进位处理,同时k进行最高位位数记录
                a[k++]=c%10;
                c/=10;
            }
        }
		//按照数组输出规则从高位进行输出
        for(i=k-1;i>=0;i--)
        {
            cout<<a[i];
        }
        cout<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值