万进制——蓝桥杯|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 ;仅仅三步我们便得出了最后结果,如果用十进制呢?每位相加,对于本例,至少要十步吧。效率快了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;
}
发布了73 篇原创文章 · 获赞 61 · 访问量 4761

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104554852
今日推荐