藍橋杯 歷屆試題 小計算器

問題描述
  模擬程序型計算器,依次輸入指令,可能包含的指令有

1. 數字:‘NUM X’,X爲一個只包含大寫字母和數字的字符串,表示一個當前進制的數
  2. 運算指令:‘ADD’,‘SUB’,‘MUL’,‘DIV’,‘MOD’,分別表示加減乘,除法取商,除法取餘
  3. 進制轉換指令:‘CHANGE K’,將當前進制轉換爲K進制(2≤K≤36)
  4. 輸出指令:‘EQUAL’,以當前進制輸出結果
  5. 重置指令:‘CLEAR’,清除當前數字

指令按照以下規則給出:
  數字,運算指令不會連續給出,進制轉換指令,輸出指令,重置指令有可能連續給出
  運算指令後出現的第一個數字,表示參與運算的數字。且在該運算指令和該數字中間不會出現運算指令和輸出指令
  重置指令後出現的第一個數字,表示基礎值。且在重置指令和第一個數字中間不會出現運算指令和輸出指令
  進制轉換指令可能出現在任何地方

運算過程中中間變量均爲非負整數,且小於2^63。
  以大寫的’A’'Z’表示1035
輸入格式
  第1行:1個n,表示指令數量
  第2…n+1行:每行給出一條指令。指令序列一定以’CLEAR’作爲開始,並且滿足指令規則
輸出格式
  依次給出每一次’EQUAL’得到的結果
樣例輸入
7
CLEAR
NUM 1024
CHANGE 2
ADD
NUM 100000
CHANGE 8
EQUAL
樣例輸出
2040

解題思路:一個很簡單的模擬題,主要思路就是

  1. 不管什麼進制在運算時都轉換成十進制來進行計算
  2. 只有在輸出的時候按照最後一次要求的進制轉換成該進制即可。
  3. 注意理解題目,題目中的“ EQUAL”只是用來按照最新一次出現的進制輸出最後的數據,運算結果並不清除。
  4. “CLEAR”只是用將結果置爲0和開始重新輸入,“Clear”操作不會改變當前的進制情況。
#include <iostream>
#include <bits/stdc++.h>
#define ll long long

using namespace std;
ll ans = 0;
string change(int k)///十進制轉化成其他進制
{

    string s="";
    ll n = ans;
    char c;
    if( n == 0)
        s = "0";

    while(n){
        int temp = n%k;
        if( temp >= 0 && temp < 10)
            c = temp + '0';
        else
            c = (temp - 10) + 'A';
        n = n/k;
        s = c + s;
    }
        //reverse(ans.begin(),ans.end());

    return s;
}
long long int change_ten(string str,int k)///其他進制轉化成十進制
{
    long long int ans = 0,temp;
    int len = str.length();
    for(int i = 0; i < len; i ++){
        if(str[i] >= '0' && str[i] <= '9')
            temp = str[i] - '0';
        else
            temp = 10 + (str[i] - 'A');
        ans = ans * k + temp;
    }
    return ans;
}
int main()
{
    int n;
    int k = 10;
    string str;
    string op;
    long long int op1;
    cin>>n;
    int flag;
    while(n--){
        cin>>str;
        if( str=="CLEAR"){
            flag = 0;
            ans = 0;
        }
        else if( str == "EQUAL"){
            cout<<change(k)<<endl;
        }
        else if(str == "NUM"){
            cin>>op;
            op1 = change_ten(op,k);
            switch(flag){
                case 0: ans = op1; break;
                case 1: ans = ans + op1; break;
                case 2: ans = ans - op1; break;
                case 3: ans = ans * op1; break;
                case 4: ans = ans / op1; break;
                case 5: ans = ans % op1; break;
            }
        }
        else if( str == "CHANGE"){
            cin>>k;
        }
        else if( str == "ADD" ){
            flag = 1;
        }
        else if( str == "SUB"){
            flag = 2;
        }
        else if( str == "MUL"){
            flag = 3;
        }
        else if( str == "DIV"){
            flag = 4;
        }
        else if( str == "MOD"){
            flag = 5;
        }
    }
    return 0;
}
發佈了105 篇原創文章 · 獲贊 15 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章