计算 N!

 N!
Time Limit:5000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

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

一开始用自己写的大数乘法模板,调用起来都费事,一开始想的事,写出一个大数乘法的模板,这样在计算大数乘法的时候就可以直接调用了,没想到自己再碰到实际问题的时候,函数调用起来这么麻烦,各种问题,写点自己的心得吧,模板虽然好用,但是关键要看你的模板的通用性,具体问题要具体分析,不要有模板可用就直接套模板,看看是否用其他方法实现起来是否更加快捷,不要被模板禁锢了自己的思维,弄了一下午的乘法模板,结果用起来还这么费事,数据还过不了,所以一定要学会变通,做题动脑子,不要上来就写,就套模板

下面是借鉴了网上大牛的代码,很精简

AC代码:

#include<cstdio>
#include<cstring>   
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
#include<iomanip>
#define maxn 10000
#define MAX 10000
using namespace std;

//这个题都用不到字符串来进行输入,所以都直接用的int类型,具体问题具体分析,如果需要输入字符串,在进行另外处理

void f(int n) {
	int a[maxn], i, j;
	int place, carry;  //位数和进位 
	a[0] = 1;
	place = 0; //默认阶乘的结果一开始为1,位数只有1为,下标从零开始 
	//计算阶乘 ,数组的第一个元素是该数字的最小位
	for(i=1; i<=n; ++i) {
		carry = 0;  //每次换一个数进行相乘,进位都要清零 
		for(j=0; j<=place; ++j) {
			a[j] = a[j] * i + carry;
			carry = a[j] / 10000;
			a[j] %= 10000;
		}
		if(carry > 0) {
			++place;
			a[place] = carry;
		}
	}
	
	//输出结果,除了最高位以外,其余位上,不够四位,补0
	cout<<a[place];
	for(i=place-1; i>=0 ; --i) 
		cout<<setw(4)<<setfill('0')<<a[i];
	cout<<endl;
	return;
}



int main()
{
	int n;
	while(cin>>n) {
		f(n);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值