ブルーブリッジカップ——階乗計算(大数乗算)


基礎練習階乗計算
時間制限:1.0 sメモリ制限:512.0 MB
問題の説明
正の整数nを入力して、nを出力します!で行ないます.ここでn!=1*2*3*…*n.
アルゴリズムの説明
  n!大きいかもしれませんが、コンピュータが表す整数の範囲は限られており、高精度な計算方法が必要です.1つの配列Aを用いて大きな整数aを表し,A[0]はaのビットを表し,A[1]はaの10ビットを表し,順次類推する.aに整数kを乗算すると、配列Aの各要素にkを乗算するようになります.対応するキャリーを処理することに注意してください.まずaを1にして、それから2に乗って、3に乗って、nに乗る時、すぐnを得ました!で行ないます.
入力フォーマット
入力には正の整数n,n<=1000が含まれます.
出力フォーマット
出力n!を行ないます.
サンプル入力
10
サンプル出力
3628800
構想:配列を利用して計算結果を保存し、キャリーに注意する.
#include
#include 
using namespace std;
const int maxn = 5001;
int main(){
	int A[maxn];
	memset(A,0,sizeof A);
	int n;
	cin>>n;
	A[0] = 1;
	int s = 0;
	int t = 0;
	for(int i = 2;i <=n;i++ )
		for(int j = 0;j < 5000;j++){
			t = s;
			s = (A[j]*i + t)/10;
			A[j] = (A[j]*i +t)%10;
		}	
	int k = 5000;
	while(A[k]== 0)
		k--;

 	while(k>=0){
		cout<