[USACO][Section 2.2][模拟] Preface Numbering

题目大意:

给出一个整数n,记录[1,n]范围内所有整数的罗马数字表示形式下罗马字母出现的次数。

思路:

简单模拟,思路见代码。

代码:

/*
ID: lujunda1
LANG: C++
PROG: preface
*/
#include
#include
#include
using namespace std;
map mark;
int check(int n)
{
    if(n>=1000)
        mark['M']+=n/1000;
    n%=1000;
    if(n>=100&&n<400)
        mark['C']+=n/100;
    else if(n>=400&&n<500)
    {
        mark['D']++;
        mark['C']++;
    }
    else if(n>=500&&n<900)
    {
        mark['D']++;
        mark['C']+=(n-500)/100; 
    }
    else if(n>=900&&n<1000)
    {
        mark['M']++;
        mark['C']++;
    }
    n%=100;
    if(n>=10&&n<40)
        mark['X']+=n/10;
    else if(n>=40&&n<50)
    {
        mark['L']++;
        mark['X']++;
    }
    else if(n>=50&&n<90)
    {
        mark['L']++;
        mark['X']+=(n-50)/10; 
    }
    else if(n>=90&&n<100)
    {
        mark['C']++;
        mark['X']++;
    }
    n%=10;
    if(n>=1&&n<4)
        mark['I']+=n;
    else if(n>=4&&n<5)
    {
        mark['V']++;
        mark['I']++;
    }
    else if(n>=5&&n<9)
    {
        mark['V']++;
        mark['I']+=n-5; 
    }
    else if(n>=9&&n<10)
    {
        mark['X']++;
        mark['I']++;
    }
}
int main()
{
    freopen("preface.in","r",stdin);
    freopen("preface.out","w",stdout);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        check(i);
    if(mark['I'])
        printf("I %d\n",mark['I']);
    if(mark['V'])
        printf("V %d\n",mark['V']);
    if(mark['X'])
        printf("X %d\n",mark['X']);
    if(mark['L'])
        printf("L %d\n",mark['L']);
    if(mark['C'])
        printf("C %d\n",mark['C']);
    if(mark['D'])
        printf("D %d\n",mark['D']);
    if(mark['M'])
        printf("M %d\n",mark['M']);
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注