万进制——蓝桥杯|ACM 大数阶乘——21行代码AC
淺談進制思想:
日常生活中我們習慣用十進制去運算;
為了方便電腦識別開發(fā)出了二進制,又因為2^3=8 , 2^4=16,因此應運而生了八進制與16進制。
世上本沒有路,走的人多了,也便成了路,那么既然二進制可以衍生出8,16進制,為什么十進制不可以呢。
因此聰明的人們開發(fā)出了萬進制,也就是10^4=10000 模仿二進制與十六進制的運算。漸漸的,我們發(fā)現(xiàn)萬進制在進行大數(shù)運算方面有著無可比擬的優(yōu)勢。
如:662343889 * 5 = 3311719445
那么如果用萬進制計算:可以設一個數(shù)組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也是非常優(yōu)秀的代碼。
代碼:
#include<bits/stdc++.h> using namespace std; void factorial(int n) {int a[3000]; a[0] = 1;int places = 0, carry, i, j; //place是當前總位數(shù) , 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; }總結
以上是生活随笔為你收集整理的万进制——蓝桥杯|ACM 大数阶乘——21行代码AC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯 试题 基础练习 字母图形——13
- 下一篇: 高效万进制——蓝桥杯|HDOJ 1002