演算法學習之路|宇宙無敵加法器

kissjz發表於2018-02-28

地球人習慣使用十進位制數,並且預設一個數字的每一位都是十進位制的。而在PAT星人開掛的世界裡,每個數字的每一位都是不同進位制的,這種神奇的數字稱為“PAT數”。每個PAT星人都必須熟記各位數字的進製表,例如“……0527”就表示最低位是7進位制數、第2位是2進位制數、第3位是5進位制數、第4位是10進位制數,等等。每一位的進位制d或者是0(表示十進位制)、或者是[2,9]區間內的整數。理論上這個進製表應該包含無窮多位數字,但從實際應用出發,PAT星人通常只需要記住前20位就夠用了,以後各位預設為10進位制。

在這樣的數字系統中,即使是簡單的加法運算也變得不簡單。例如對應進製表“0527”,該如何計算“6203+415”呢?我們得首先計算最低位:3+5=8;因為最低位是7進位制的,所以我們得到1和1個進位。第2位是:0+1+1(進位)=2;因為此位是2進位制的,所以我們得到0和1個進位。第3位是:2+4+1(進位)=7;因為此位是5進位制的,所以我們得到2和1個進位。第4位是:6+1(進位)=7;因為此位是10進位制的,所以我們就得到7。最後我們得到:6203+415=7201。

輸入格式

輸入首先在第一行給出一個N位的進製表(0 < N <=20),以回車結束。 隨後兩行,每行給出一個不超過N位的正的PAT數。

輸出格式

在一行中輸出兩個PAT數之和。

輸入樣例:
30527
06203
415
輸出樣例:
7201
我的思路

先將兩個數以十進位制方式相加,不進位。

栗子:

68+67= 12 15

這種方式。

然後我們根據給出的進製表,從個位開始依次判斷,多出的數進位,依次判斷並進位,最後,

得出最終結果。

#include<iostream>
#include<vector>
#include<cstdio>
#include<string>
using namespace std;
int main(){
    vector<int> into;
    string a,b;
    int c;
    cin>>a;
    b=":::::::::::::::::::::::::::::::::::::::::"+a;//佔位符
    for(int i=b.size()-1;i>=0;i--){
        c=b[i]-`0`;
        if(c==0)
            c=10;
        into.push_back(c);
    }//構造進製表,0~40,:-‘0’為10,即十進位制。
    
    vector<int>v1,v2;
    
    cin>>a;
    cin>>b;
    if(a.size()>b.size()){
        for(int i=b.size()-1;i>=0;i--)
            v1.push_back(b[i]-`0`);
        for(int i=a.size()-1;i>=0;i--)
            v2.push_back(a[i]-`0`);
    }
    else{
        for(int i=a.size()-1;i>=0;i--)
            v1.push_back(a[i]-`0`);
        for(int i=b.size()-1;i>=0;i--)
            v2.push_back(b[i]-`0`);
    }//v2儲存大的字元
    
    for(int i=0;i!=v1.size();i++){
        v2[i]+=v1[i];
    }//兩數相加,以十進位制方式

    for(int i=0;i<40;i++)
        v2.push_back(0);
    
    
    for(int i=0;i<v2.size();i++){
        v2[i+1]+=v2[i]/into[i];//兩個式子順序尤為重要!式子2改變了源
        v2[i]=v2[i]%into[i];
    }
    int flag=1;
    for(int i=v2.size()-1;i>=0;i--){
        if(v2[i]!=0)
            flag=0;
        if(flag==0)
            cout<<v2[i];
    }
    if(flag==1){
        cout<<0;
    }
}


相關文章