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 }

 

 

 

posted @ 2012-05-14 19:19    阅读(198)  评论(0编辑  收藏  举报