• <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
               :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理

            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);
                        }
                    }
                }
            }

             


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            人妻无码αv中文字幕久久 | 久久人人爽人人爽人人AV东京热 | 久久国产影院| 久久亚洲AV无码精品色午夜麻豆| 亚洲伊人久久大香线蕉综合图片| 成人免费网站久久久| 精品多毛少妇人妻AV免费久久| 欧美激情一区二区久久久| 精品久久一区二区三区| 久久无码专区国产精品发布| 久久99热精品| 五月丁香综合激情六月久久| 99久久国产综合精品网成人影院 | 成人国内精品久久久久影院VR | 99久久婷婷国产综合亚洲| 少妇被又大又粗又爽毛片久久黑人| 精产国品久久一二三产区区别| 久久国产乱子精品免费女| 亚洲精品无码久久千人斩| 久久久久久无码国产精品中文字幕 | 欧洲精品久久久av无码电影| 久久亚洲国产成人影院网站| 国产韩国精品一区二区三区久久| 久久精品国产欧美日韩99热| 国产精品久久久天天影视香蕉 | 久久久精品国产sm调教网站| 偷偷做久久久久网站| 人妻无码久久精品| 亚洲美日韩Av中文字幕无码久久久妻妇 | 国产精品久久毛片完整版| 国产成人精品综合久久久| 一级a性色生活片久久无| 久久综合给合综合久久| 国产亚洲精午夜久久久久久| 日本精品久久久久中文字幕| 超级碰久久免费公开视频| 久久本道久久综合伊人| 久久精品国产精品亚洲人人| 久久精品成人免费国产片小草| 一本大道久久东京热无码AV| 亚洲欧美日韩久久精品|