首页 > ACM题库 > HDU-杭电 > hdu 1924 CIVIC DILL MIX-模拟-[解题报告]C++
2013
12-26

hdu 1924 CIVIC DILL MIX-模拟-[解题报告]C++

CIVIC DILL MIX

问题描述 :

Roman numerals are an ancient numbering system used extensively throughout Europe through the 13th century (where it was eventually replaced by our current positional system). Vestiges of this system still exist today on clock faces, building cornerstones, Super Bowls and Star Wars episodes. The system uses the following 7 symbols:

Symbols I, X, C and M can be repeated as needed (though never more than three times for I, X and C), so that 3 is represented as III, 27 as XXVII and 4865 as MMMMDCCCLXV. The symbols are always written from the highest value to the lowest, but for one exception: if a lower symbol precedes a higher one, it is subtracted from the higher. Thus 4 is written not as IIII but as IV, and 900 is written as CM. The rules for this subtractive behavior are the following:
1. Only I, X and C can be subtracted.
2. These numbers can only appear once in their subtractive versions (e.g., you can’t write 8 as IIX).
3. Each can only come before symbols that are no larger than 10 times their value. Thus we can not write IC for 99 or XD for 490 (these would be XCIX and CDXC, respectively). Note that the first two words in this problem title are invalid Roman numerals, but the third is fine.
Your task for this problem is simple: read in a set of Roman numeral values and output their sum as a Roman numeral.

输入:

Input will consist of multiple test cases. Each test case starts with a positive integer n indicating the number of values to add. After this will come n values (potentially several on a line), all valid Roman numerals with whitespace only coming between values. A value of n = 0 will indicate end of input. All sums will be less than 5000.

输出:

Input will consist of multiple test cases. Each test case starts with a positive integer n indicating the number of values to add. After this will come n values (potentially several on a line), all valid Roman numerals with whitespace only coming between values. A value of n = 0 will indicate end of input. All sums will be less than 5000.

样例输入:

2
XII MDL
4
I I I
I
0

样例输出:

Case I: MDLXII
Case II: IV

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N = 5010;//这儿必须是大于5000,要不然就Runtime error
char str[N][25];
int Judge(char c)
{
    if (c == 'I')
    {
        return 1;
    }
    else if (c == 'V')
    {
        return 5;
    }
    else if (c == 'X')
    {
        return 10;
    }
    else if (c == 'L')
    {
        return 50;
    }
    else if (c == 'C')
    {
        return 100;
    }
    else if (c == 'D')
    {
        return 500;
    }
    else if (c == 'M')
    {
        return 1000;
    }
    return 0;
}
void Print(int ans)//输出函数
{
    while (ans)
    {
        if (ans >= 1000)
        {
            printf("M");
            ans -= 1000;
        }
        else if (ans >= 900)//特殊
        {
            printf("CM");
            ans -= 900;
        }
        else if (ans >= 500)
        {
            printf("D");
            ans -= 500;
        }
        else if (ans >= 400)
        {
            printf("CD");
            ans -= 400;
        }
        else if (ans >= 100)
        {
            printf("C");
            ans -= 100;
        }
        else if (ans >= 90)
        {
            printf("XC");
            ans -= 90;
        }
        else if (ans >= 50)
        {
            printf("L");
            ans -= 50;
        }
        else if (ans >= 40)
        {
            printf("XL");
            ans -= 40;
        }
        else if (ans >= 10)
        {
            printf("X");
            ans -= 10;
        }
        else if (ans==9)
        {
            printf("IX");
            ans -= 9;
        }
        else if (ans >= 5 && ans < 9)
        {
            printf("V");
            ans -= 5;
        }
        else if (ans == 4)
        {
            printf("IV");
            ans -= 4;
        }
        else if (ans >= 1 && ans < 4)
        {
            printf("I");
            ans -= 1;
        }
    }
}
int main()
{
    int n, i, ans, j, count = 1;
    while (scanf("%d", &n) != EOF && n)
    {
        memset(str, 0, sizeof(str));
        for (i = 0; i < n; ++i)
        {
            scanf("%s", str[i]);
        }
        ans = 0;
        for(i = 0; i < n; ++i)
        {
            int len = strlen(str[i]);
            for (j = 0; j < len; ++j)
            {
                //只要前面的比后面的小,例如IV表示的是4,应该V- I
                if (Judge(str[i][j]) < Judge(str[i][j + 1]) && j < len - 1 && (str[i][j] == 'I' || str[i][j] == 'X' || str[i][j] == 'C'))
                {
                    ans -= Judge(str[i][j]);
                }
                else
                {
                    ans += Judge(str[i][j]);
                }
            }
        }
        printf("Case ");
        Print(count);
        count ++;
        printf(": ");
        Print(ans);
        printf("\n");
    }
    return 0;
}

解题转自:http://www.cnblogs.com/lidaojian/archive/2012/03/18/2404717.html


  1. Often We don’t set up on weblogs, but I would like to condition that this established up really forced me individually to do this! considerably outstanding publish