PREV-55 小计算器

模拟即可,注意输出时候大于等于10的数要输出字母,比如16进制下,10~15用A~F表示; 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stack>
#include<cstring>
using namespace std;

typedef long long ll;
const double epos=1.0e-7;
const int inf=0x3f3f3f3f;
stack<char>ss;
char lll[9]="CHANGE";
int check(char s[]){//判断是不是进制转换;
	int len=strlen(s);
	if(len<6) return 0;
	for(int i=0;i<6;++i){
		if(s[i]!=lll[i]) return 0;
	}
	return 1;
}

char s[999];
int main(){
    int n;
    ll num;
    scanf("%d",&n);
    getchar();
    int jinzhi=10;
    int biao=0;//0,1,2,3,4,5清空,运算; 
    ll y=0;
    while(n--){
        gets(s);
        if(strcmp(s,"CLEAR")==0){
            num=0;
            biao=0;
            y=0;
        }
        else if(strcmp(s,"EQUAL")==0){
        	ll yy=num;
        	if(yy==0){
        		printf("0\n");
        		continue;
			}
        	while(yy){
        		int hh=yy%jinzhi;
        		if(hh>=10) ss.push((char)(hh-10+'A'));
        		else ss.push((char)(hh+'0'));
        		yy/=jinzhi;
			}
			while(!ss.empty()){
				printf("%c",ss.top());
				ss.pop();
			}
			printf("\n");	
		} 
		else if(strcmp(s,"ADD")==0){
			biao=1;
		}
		else if(strcmp(s,"SUB")==0){
			biao=2;
		}
		else if(strcmp(s,"MUL")==0){
			biao=3;
		}
		else if(strcmp(s,"DIV")==0){
			biao=4;
		}
		else if(strcmp(s,"MOD")==0){
			biao=5;
		}
		else if(check(s)){
			int t=0;
			int len=strlen(s);
			for(int i=7;i<len;++i)
				if(s[i]>='A'&&s[i]<='Z'){
					t=t*10+s[i]-'A'+10;
				}
				else
					t=t*10+s[i]-'0';
			jinzhi=t;
			
		}
		else{
			int len=strlen(s);
            y=0;
            for(int i=4;i<len;++i){
            	if(s[i]>='A'&&s[i]<='Z'){
            		y=y*jinzhi+s[i]-'A'+10;
				}
				else
					y=y*jinzhi+s[i]-'0';
			}
			if(biao==0) num=y;
			else if(biao==1) num+=y;
			else if(biao==2) num-=y;
			else if(biao==3) num*=y;
			else if(biao==4) num/=y;
			else num%=y;
		}
        
        
        
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/chenyume/article/details/88650633
今日推荐