解题思路:模拟就完了,注意几个点,每次输入数的时候记得更改一下进制,已经输出的时候也要转化一下最近的进制

  1. #include<bits/stdc++.h>
  2. #define x first
  3. #define y second
  4. #define mem(h) memset(h,-1,sizeof h)
  5. #define mcp(a,b) memcpy(a,b,sizeof b)
  6. using namespace std;
  7. typedef long long LL;
  8. typedef unsigned long long ull;
  9. typedef pair<int,int>PII;
  10. typedef pair<double,double>PDD;
  11. namespace IO{
  12. inline LL read(){
  13. LL o=0,f=1;char c=getchar();
  14. while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
  15. while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
  16. return o*f;
  17. }
  18. }using namespace IO;
  19. //#############以上是自定义技巧(可忽略)##########
  20. const int N=1e2+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e8+7,P=131;
  21. char str[37];
  22. stack<int>o;
  23. stack<string>oo;
  24. string op;
  25. LL s,x;
  26. char num[N],ans[N];
  27. int n;
  28. void init(){
  29. for(int i=0;i<10;i++)str[i]=i+'0';
  30. for(int i=10;i<=36;i++)str[i]=(i-10)+'A';
  31. }
  32. void change(LL x,int jz){//进制转化
  33. int cnt=0;
  34. while(x){
  35. ans[cnt++]=str[x%jz];
  36. x/=jz;
  37. }
  38. for(int i=cnt-1;i>=0;i--){
  39. cout<<ans[i];
  40. }
  41. cout<<endl;
  42. }
  43. LL cal(char *num,int jz){//进制转化
  44. LL res=0;
  45. int len=strlen(num);
  46. for(int i=0;i<len;i++){
  47. if(num[i]>='0'&&num[i]<='9'){
  48. res+=(num[i]-'0')*pow(jz,len-i-1);
  49. }else{
  50. res+=(num[i]-'A'+10)*pow(jz,len-i-1);
  51. }
  52. }
  53. return res;
  54. }
  55. int main(){//o存放的是进制,oo存放的是运算符,s表示当前的数,x表示输入的数转化进制后的数
  56. init();
  57. cin>>n;
  58. o.push(10);//最开始是十进制
  59. for(int i=0;i<n;i++){
  60. cin>>op;
  61. if(op=="CLEAR"){
  62. s=0;
  63. }else if(op=="NUM"){
  64. cin>>num;
  65. x=cal(num,o.top()); //输入的数转化进制
  66. if(!oo.empty()){//如果运算符里有运算符就计算
  67. if(oo.top()=="ADD"){
  68. s+=x;
  69. }else if(oo.top()=="SUB"){
  70. s-=x;
  71. }else if(oo.top()=="MUL"){
  72. s*=x;
  73. }else if(oo.top()=="DIV"){
  74. s/=x;
  75. }else{
  76. s%=x;
  77. }
  78. oo.pop();
  79. }else{
  80. s=cal(num,o.top());//如果没有那么当前的数就为新输入的数转化进制后
  81. }
  82. }else if(op=="CHANGE"){//放入新进制
  83. int k;
  84. cin>>k;
  85. o.pop();//弹出旧进制后放入新进制
  86. o.push(k);
  87. }else if(op=="EQUAL"){//把当前的数转化为最新的进制
  88. change(s,o.top());
  89. }else {
  90. oo.push(op);
  91. }
  92. }
  93. return 0;
  94. }
点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论