⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2409463_ac_0ms_40k.c

📁 北大大牛代码 1240道题的原代码 超级权威
💻 C
字号:
#include <stdio.h>

int stack[100];
int p;

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

    while (*s!='\0') {
        switch (*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");
}

void print()
{
	PrintRoman(stack[p]);
}

int main()
{
	int t;
	char in[10];

	p = -1;
	while(scanf("%s",in)==1)
	{
		if(in[0]=='=')
		{
			if(p>-1)
				print();
			else
				printf("stack underflow\n");
			continue;
		}
		if(in[0]=='+')
		{
			if(p>0)
			{
				t = stack[p]+stack[p-1];
				stack[--p] = t;
			}
			else
				printf("stack underflow\n");
			continue;
		}
		if(in[0]=='-')
		{
			if(p>0)
			{
				t = stack[p-1]-stack[p];
				stack[--p] = t;
			}
			else
				printf("stack underflow\n");
			continue;
		}
		if(in[0]=='*')
		{
			if(p>0)
			{
				t = stack[p]*stack[p-1];
				stack[--p] = t;
			}
			else
				printf("stack underflow\n");
			continue;
		}
		if(in[0]=='/')
		{
			if(p>0)
			{
				if(stack[p])
				{
					t = stack[p-1]/stack[p];
					stack[--p] = t;
				}
				else
				{
					p--;
					printf("division by zero exception\n");
				}
			}
			else
				printf("stack underflow\n");
			continue;
		}
		t = FromRoman(in);
		if(t>0&&t<5000)
			stack[++p] = t;
	}
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -