淺談進制思想:
日常生活中我們習慣用十進制去運算;
爲了方便電腦識別開發出了二進制,又因爲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;
}