浅谈进制思想:
日常生活中我们习惯用十进制去运算;
为了方便电脑识别开发出了二进制,又因为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 ;仅仅三步我们便得出了最后结果,如果用十进制呢?每位相加,对于本例,至少要十步吧。效率快了3倍不止。
注意点:
本题 严格 模拟手算,相当于简化版的乘法。
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;
}