ACM 计算器

在这里插入图片描述
问题描述  模拟程序型计算器,依次输入指令,可能包含的指令有 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’表示10~35输入格式  第1行:1个n,表示指令数量  第2…n+1行:每行给出一条指令。指令序列一定以’CLEAR’作为开始,并且满足指令规则输出格式  依次给出每一次’EQUAL’得到的结果样例输入7CLEARNUM 1024CHANGE 2ADDNUM 100000CHANGE 8EQUAL样例输出2040c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>//字符处理函数typedef long long LL;//将long long 用LL代替 用于存放超大数据LL GOD;//GOD定义为LL 类型,同long long int GOD 的用法int require,base;LL transform(char *num){ int i; LL sum=0,nowbase=1; for(i=strlen(num)-1;i>=0;i--)//计算字符串长度的函数 { if(isdigit(num[i]))//此行下有注释 sum+=(num[i]-'0')*nowbase; else sum+=(num[i]-'A'+10)*nowbase; nowbase*=base; } return sum;}int notransform(char *num){ int sp=0; sscanf(num,"%d",&sp);//获取整型数据并将数据值存入sp中 return sp;}char* retransform(LL num){ static char ans[100]={0};//初始值全部设为0 int index=1; if(!num)//num的值为空 ans[index++]='0'; while(num) { int temp=(num%base); if(temp<10) ans[index++]=temp+'0'; else ans[index++]=temp-10+'A'; num/=base; } ans[0]=index-1; return ans;}void runorder(char *str){ char Torder[9][10]={"NUM","ADD","SUB","MUL","DIV","MOD","CHANGE","EQUAL","CLEAR"}; char sp[10]; sscanf(str,"%s",sp); char spnum[100]={0}; if(strlen(sp)!=strlen(str)) sscanf(str,"%*s%s",spnum); int i,j; char *temp=NULL; for(i=0;i<9;i++) { if(!strcmp(sp,Torder[i])) { switch(i) { case 0: if(require==0) GOD=transform(spnum); else { if(require==1) GOD+=transform(spnum); if(require==2) GOD-=transform(spnum); if(require==3) GOD*=transform(spnum); if(require==4) GOD/=transform(spnum); if(require==5) GOD%=transform(spnum); require=0; } break; case 1: require=1;break; case 2: require=2;break; case 3: require=3;break; case 4: require=4;break; case 5: require=5;break; case 6: base=notransform(spnum);break; case 7: temp=retransform(GOD); for(j=temp[0];j>=1;j--) putchar(temp[j]); putchar('\n'); break; case 8: GOD=0; require=0; } } }}int main(int argc,char **argv){ int cnt; scanf("%d",&cnt); base=10,require=0; while(cnt--) { char order[30]; scanf("%*c%[^\n]",order); runorder(order); } return EXIT_SUCCESS;}外文名: isdigit头文件:<ctype.h>©(C++)函数定义: int isdigit(int c)函数说明:检查参数是否为十进制数字字符若参数c为阿拉伯数字0~9,则返回非0值,否则返回0。for(i=strlen(num)-1;i>=0;i–) 之所以使用i=strlen(num)-1,是因为i>=0,如果i>0,则不必使i=strlen(num)-1直接i=strlen(num)即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值