POJ 1588 Reverse Roman Notation
题意概述:用罗马数字在堆栈里进行四则运算
解决思路:用贪心模拟阿拉比数字和罗马数字之间的转换,细节
Code Length居然排第一!
除0出错的时候0要出栈,WA了一次
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 char s[8]="IVXLCDM"; 6 int b[7]={1,5,10,50,100,500,1000}; 7 8 int ToDec(char *str) 9 { 10 int n,k,i,j,c[33]; 11 n=(int)strlen(str); 12 for(i=0;i<n;i++) 13 for(j=0;j<7;j++) 14 if(str[i]==s[j]) 15 { 16 c[i]=b[j]; 17 break; 18 } 19 c[n]=0; 20 for(i=k=0;i<n;i++) 21 if(c[i+1]>c[i]) 22 k-=c[i]; 23 else 24 k+=c[i]; 25 return k; 26 } 27 28 void ToRoman(int k,char *str) 29 { 30 int i,j,m; 31 for(i=6,j=0;i>=0;i--) 32 { 33 while(k>=b[i]) 34 str[j++]=s[i],k-=b[i]; 35 if(!k) 36 break; 37 if(i&1) 38 m=i-1; 39 else 40 m=i-2; 41 if(k>=b[i]-b[m]) 42 { 43 k-=b[i]-b[m]; 44 str[j++]=s[m]; 45 str[j++]=s[i]; 46 } 47 } 48 str[j]='\0'; 49 } 50 51 int main() 52 { 53 char str[33]; 54 int k,i,j,stk[1111]; 55 for(i=j=0;scanf("%s",str)+1;) 56 { 57 if(str[0]=='=') 58 { 59 if(!i) 60 { 61 puts("stack underflow"); 62 continue; 63 } 64 if(stk[i-1]<=0||stk[i-1]>4999) 65 puts("out of range exception"); 66 else 67 ToRoman(stk[i-1],str),puts(str); 68 } 69 else if(str[0]=='+'||str[0]=='-'||str[0]=='*'||str[0]=='/') 70 { 71 if(i<2) 72 { 73 puts("stack underflow"); 74 continue; 75 } 76 if(str[0]=='+') 77 stk[i-2]=stk[i-1]+stk[i-2]; 78 else if(str[0]=='-') 79 stk[i-2]=stk[i-2]-stk[i-1]; 80 else if(str[0]=='*') 81 stk[i-2]=stk[i-1]*stk[i-2]; 82 else 83 { 84 if(!stk[i-1]) 85 puts("division by zero exception"); 86 else 87 stk[i-2]=stk[i-2]/stk[i-1]; 88 } 89 i--; 90 } 91 else 92 stk[i++]=ToDec(str); 93 } 94 return 0; 95 }