• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 7, comments - 13, trackbacks - 0, articles - 37
               :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理

            Problem H: Reverse Roman Notation

            Posted on 2008-09-23 20:51 歲月流逝 閱讀(318) 評論(0)  編輯 收藏 引用

            #include <stdio.h>
            #include <string.h>
            #include <ctype.h>
            char * index( const char *s, int c);
            /*
            ** State machine for romantoint
            **
            **        M       D       C       L       X       V       I
            **  0: +1000/0  +500/0  +100/1   +50/0   +10/2    +5/0    +1/3
            **  1:  +800/0   --     +100/0   +50/0   +10/2    +5/0    +1/3
            **  2:   --      --      +80/0   +30/0   +10/2    +5/0    +1/3
            **  3:   --      --      --      --       +8/0    +3/0    +1/3
            **
            */

            int FromRoman(char *s)
            {
                int n=0;
                int prev=0;

                while (*s!=' '&&*s!=NULL) {
                    switch (toupper(*s))
                    {
                        case 'M':   n += 1000 - prev*2;
                                    prev=0;
                                    break;
                        case 'D':   n +=  500 - prev*2;
                                    prev=0;
                                    break;
                        case 'C':   n +=  100;
                                    if (prev < 100) n -= 2*prev;
                                    prev=100;
                                    break;
                        case 'L':   n +=   50;
                                    if (prev <  50) n -= 2*prev;
                                    prev=0;
                                    break;
                        case 'X':   n +=   10;
                                    if (prev <  10) n -= 2*prev;
                                    prev=10;
                                    break;
                        case 'V':   n +=    5;
                                    if (prev <   5) n -= 2*prev;
                                    prev=0;
                                    break;
                        case 'I':   n +=    1;
                                    prev=1;
                                    break;
                    }
                    s++;
                }
                return n;
            }

            void PrintRoman(int n)
            {

                if (n<=0 || n>4999)
                 {
                    printf("out of range exception\n");
                    return;
                }

                while (n/1000)
                {
                    printf("M");
                    n -= 1000;
                }

                switch(n/100)
                {
                    case 0: break;
                    case 1: printf("C");    break;
                    case 2: printf("CC");   break;
                    case 3: printf("CCC");  break;
                    case 4: printf("CD");   break;
                    case 5: printf("D");    break;
                    case 6: printf("DC");   break;
                    case 7: printf("DCC");  break;
                    case 8: printf("DCCC"); break;
                    case 9: printf("CM");   break;
                }
                n %= 100;

                switch(n/10)
                 {
                    case 0: break;
                    case 1: printf("X");    break;
                    case 2: printf("XX");   break;
                    case 3: printf("XXX");  break;
                    case 4: printf("XL");   break;
                    case 5: printf("L");    break;
                    case 6: printf("LX");   break;
                    case 7: printf("LXX");  break;
                    case 8: printf("LXXX"); break;
                    case 9: printf("XC");   break;
                }
                n %= 10;
                switch(n) {
                    case 0: break;
                    case 1: printf("I");    break;
                    case 2: printf("II");   break;
                    case 3: printf("III");  break;
                    case 4: printf("IV");   break;
                    case 5: printf("V");    break;
                    case 6: printf("VI");   break;
                    case 7: printf("VII");  break;
                    case 8: printf("VIII"); break;
                    case 9: printf("IX");   break;
                }

                printf("\n");
            }

            #define STACKSIZE 1024
            int nitems=0;
            int stack[STACKSIZE];

            int Pop()
            {
                if (!nitems) {
                    printf("stack underflow\n");
                    return 0;
                }

                return stack[--nitems];
            }

            void Push(int n)
            {
                if (nitems == STACKSIZE-1) {
                    printf("stack overflow\n");
                    return;
                }

                stack[nitems++] = n;
            }


            int PrintTop(void)
            {
                if (!nitems) {
                    printf("stack underflow\n");
                    return -1;
                }
                else {
                    PrintRoman(stack[nitems-1]);
                    return 0;
                }
            }

            int PerformAdd(void)
            {
                int x,y;
                if (nitems < 2) {
                    printf("stack underflow\n");
                    return -1;
                }

                y = Pop();
                x = Pop();
               
                Push(x+y);

                return 0;
            }

            int PerformSub(void)
            {
                int x,y;
                if (nitems < 2) {
                    printf("stack underflow\n");
                    return -1;
                }

                y = Pop();
                x = Pop();
               
                Push(x-y);

                return 0;
            }

            int PerformMul(void)
            {
                int x,y;
                if (nitems < 2) {
                    printf("stack underflow\n");
                    return -1;
                }

                y = Pop();
                x = Pop();
               
                Push(x*y);

                return 0;
            }

            int PerformDiv(void)
            {
                int x,y;
                if (nitems < 2) {
                    printf("stack underflow\n");
                    return -1;
                }

                y = Pop();
                x = Pop();
               
                if (y!=0)
                    Push(x/y);
                else {
                    printf("division by zero exception\n");
                    Push(x);
                }

                return 0;
            }

            main()
            {
                char line[256];
             //freopen("H.in","r",stdin);
            // freopen("H.out","w",stdout);
                while (fgets(line,sizeof(line),stdin)) {
                    if (line[0] == '=')
                        PrintTop();
                    else if (line[0] == '+')
                        PerformAdd();
                    else if (line[0] == '-')
                        PerformSub();
                    else if (line[0] == '*')
                        PerformMul();
                    else if (line[0] == '/')
                        PerformDiv();
                    else {
                        int n = FromRoman(line);
                        if (n > 0) {
                            Push(n);
                        }
                    }
                }
            }

             

            亚洲精品美女久久久久99| 欧美亚洲国产精品久久蜜芽| 国产亚洲精久久久久久无码77777| 欧美精品乱码99久久蜜桃| 国产午夜福利精品久久2021| 国产精品九九久久免费视频 | 亚洲AV日韩AV天堂久久| 69久久精品无码一区二区| 狠狠精品久久久无码中文字幕| 久久人人爽人人爽人人片AV麻烦| 久久99免费视频| 久久国产欧美日韩精品| 久久精品国产精品亚洲| 国产Av激情久久无码天堂| 伊人久久五月天| 93精91精品国产综合久久香蕉 | 免费精品久久久久久中文字幕 | 亚洲精品美女久久久久99小说| 91精品国产91久久综合| 久久精品国产欧美日韩99热| 91久久精品电影| 久久久久久狠狠丁香| 亚洲∧v久久久无码精品| 久久伊人精品一区二区三区| 日本精品久久久久影院日本| 精品久久久久久99人妻| 国产成人精品久久一区二区三区av | 99久久精品免费看国产免费| 精品久久久久久久无码| 久久精品人人做人人爽电影| 中文字幕无码久久久| 综合久久给合久久狠狠狠97色| 美女久久久久久| 欧美久久天天综合香蕉伊| 精品久久久久久国产牛牛app| 久久中文娱乐网| 国产无套内射久久久国产| 久久久久亚洲精品男人的天堂| 久久久久综合国产欧美一区二区| 精品多毛少妇人妻AV免费久久| 久久久精品久久久久久|