高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC
淺談進制思想:
日常生活中我們習(xí)慣用十進制去運算;
為了方便電腦識別開發(fā)出了二進制,又因為2^3=8 , 2^4=16,因此應(yīng)運而生了八進制與16進制。
世上本沒有路,走的人多了,也便成了路,那么既然二進制可以衍生出8,16進制,為什么十進制不可以呢。
因此聰明的人們開發(fā)出了萬進制,也就是10^4=10000 模仿二進制與十六進制的運算。漸漸的,我們發(fā)現(xiàn)萬進制在進行大數(shù)運算方面有著無可比擬的優(yōu)勢。
如:662343889 * 5 = 3311719445
那么如果用萬進制計算:可以設(shè)一個數(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 ;僅僅三步我們便得出了最后結(jié)果,如果用十進制呢?每位相加,對于本例,至少要十步吧。效率快了3倍不止。
注意點:
本題 嚴(yán)格 模擬手算。(見11行-19行代碼)
1、本題用萬能頭文件代替#include<iostream>和#include<iomanip>。
傳送門→萬能頭文件
2、萬進制逢萬進一,效率極高,日后做ACM也是非常優(yōu)秀的代碼。
3、用cin輸入char型數(shù)組,a[strlen(a)]的值為空, 一定要補0!見第九行代碼。(筆者被坑的很慘)
4、最后輸出時,第一要過濾值為0的數(shù),第二要過濾第一個值不為0的數(shù)。(見21-28行代碼)
如:0000 0123 2345 。 這個數(shù)的0000不能輸出。且0123要變?yōu)?23
5、26行的作用是:讓形如:1234 ??567 2345 的數(shù),變?yōu)?#xff1a;1234 0567 2345
代碼:
#include<bits/stdc++.h> using namespace std; int main() {char a1[100], a2[100]; memset(a1,'0',sizeof(a1)); memset(a2,'0',sizeof(a2));int b1[25]; memset(b1, 0, sizeof(b1)); //int型長度是char型的四分之一cin >> a1 >> a2;reverse(a1,a1+strlen(a1)); reverse(a2,a2+strlen(a2)); //這里要反轉(zhuǎn)兩次reverse(a1,a1+100); reverse(a2,a2+100);a1[strlen(a1)] = '0'; a2[strlen(a2)] = '0'; //這里需要置0,否則是空。int places = 0, carry;for(int i = 99; i >= 0; i -= 4) {carry = 0;b1[places] += ((a1[i-3]-'0')*1000+(a1[i-2]-'0')*100+(a1[i-1]-'0')*10+(a1[i]-'0')+(a2[i-3]-'0')*1000+(a2[i-2]-'0')*100+(a2[i-1]-'0')*10+(a2[i]-'0'));carry = b1[places]/10000;b1[places]%=10000; places++; //下一位 if(carry > 0) b1[places]++; //進位 }bool flag1 = false, flag2 = false;for(int i = places; i >= 0; i--) {if(!flag1 && b1[i] == 0) continue; //忽略前導(dǎo)0 else {flag1 = !flag1; if(!flag2) { flag2 = !flag2; cout << b1[i]; } else cout << setw(4) << setfill('0') << b1[i]; //填充0}}return 0; }總結(jié)
以上是生活随笔為你收集整理的高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万进制——蓝桥杯|ACM 大数阶乘——2
- 下一篇: 蓝桥杯 试题 基础练习 Huffuman