zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    第01组 每周小结(3/3)
    第01组 每周小结(2/3)
    第01组 每周小结 (1/3)
    第01组 Beta冲刺总结
    第01组 Beta冲刺 (5/5)
    第01组 beta冲刺(4/5)
    第01组 beta冲刺(3/5)
    第01组 beta冲刺(2/5)
    第01组 Beta冲刺(1/5)
    latex Illegal, another ibstyle command
  • 原文地址:https://www.cnblogs.com/xchaos/p/2499886.html
Copyright © 2011-2022 走看看