萬進制——藍橋杯|ACM 大數階乘——21行代碼AC

淺談進制思想:

日常生活中我們習慣用十進制去運算;
爲了方便電腦識別開發出了二進制,又因爲2^3=8 , 2^4=16,因此應運而生了八進制與16進制。
世上本沒有路,走的人多了,也便成了路,那麼既然二進制可以衍生出8,16進制,爲什麼十進制不可以呢。
因此聰明的人們開發出了萬進制,也就是10^4=10000 模仿二進制與十六進制的運算。漸漸的,我們發現萬進制在進行大數運算方面有着無可比擬的優勢。
如:662343889 * 5 = 3311719445
那麼如果用萬進制計算:可以設一個數組a[3]; a[2] = 3889 ; a[1] = 6234 ; a[0] = 6 ;
第一步:a[2] * 5 = 19445 ; 19445 %10000 = 1餘9445 9445留下,1進位;
第二步:a[1] * 5 = 31170 ; 31170 %10000 = 3餘1170 1170留下,加上進位的1爲1171(終值),3進位;
第三步:a[0] * 5 = 30 ; 30+3(進位)爲終值。
按順序輸出得:3311719945 ;僅僅三步我們便得出了最後結果,如果用十進制呢?

注意點:

1、本題用萬能頭文件代替#include<iostream>#include<iomanip>
傳送門→萬能頭文件
2、萬進制逢萬進一,效率極高,日後做ACM也是非常優秀的代碼。

代碼:

#include<bits/stdc++.h>
using namespace std;
void factorial(int n) {
	int a[3000]; a[0] = 1;
	int places = 0, carry, i, j;				//place是當前總位數 , carry是進位 
	for(int i = 1; i <= n; i++) {
		carry = 0;					
		for(j = 0; j <= places; j++) {			//核心代碼 
			a[j] = a[j]*i + carry; 	
			carry = a[j]/10000; 
			a[j]%=10000; }
		if(carry > 0) { places++; a[places] = carry; } //進位操作 
	}
	cout << a[places];
	for(i = (places-1); i >= 0; i--) 
		cout << setw(4) << setfill('0') << a[i];	//高位補0 
}
int main() {
	int n; cin >> n; factorial(n);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章