超大数問題:N!

1322 ワード

試験問題基礎練習階乗計算
この問題をコミット
リソースの制限
時間制限: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
大数はそのままpythonでやろうと思っていましたが、申し込んだのはC++だったので、シミュレーションを書くしかありませんでした.
vectorを使って作ります.
手算乗算AXBは、Aの各ビットがBに対して乗算を行い、これはlong longのデータを爆発させない(安心乗算)、そして答えを遍歴して維持し、そのキャリーのキャリー、この型のタッチ、それから前へキャリーする場合はvectorのinsert操作を使って、直接前にデータを挿入して、最後に答えを出力します.
コード:
#include
#include
#include
#include
#include
using namespace std;
const int maxn = 10005;

int main() {
	int n;
	cin >> n;
	vectorv;
	v.push_back(1);
	
	for(int i=2;i<=n;i++){
		int len=v.size();
		for(int j=0;j=0;j--){
			int temp=jinwei+v[j];
			jinwei=temp/10;
			v[j]=temp%10;
		}
		while(jinwei){
			v.insert(v.begin(),jinwei%10);
			jinwei/=10;
		}
	}
	
	for(int i=0;i