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

📄 1312.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 CPP
字号:
/*  This Code is Submitted by wywcgs for Problem 1312 on 2005-10-13 at 22:45:56 */ 
#include <stdio.h>
#include <string.h>
#define  MAX  1024
#define  MAX_LEN  32

int changeToNumber(char*);
void changeToRoman(int, char*);
void cycSub(int*, char*, int*, int);
void oneSub(int*, char*, int*, int, int);
int romanValue(char);
char arabValue(int);

int main()
{
	long stack[MAX], a, b;
	int top = 0;
	char line[MAX_LEN], roman[MAX_LEN];
	
	while(gets(line) != NULL) {
		if(!strcmp(line, "+")) {
			if(top < 2) {
				printf("stack underflow\n");
			} else {
				a = stack[--top];
				b = stack[--top];
				stack[top++] = a + b;
			}
		} else if(!strcmp(line, "-")) {
			if(top < 2) {
				printf("stack underflow\n");
			} else {
				a = stack[--top];
				b = stack[--top];
				stack[top++] = b - a;
			}
		} else if(!strcmp(line, "*")) {
			if(top < 2) {
				printf("stack underflow\n");
			} else {
				a = stack[--top];
				b = stack[--top];
				stack[top++] = a * b;
			}
		} else if(!strcmp(line, "/")) {
			if(top < 2) {
				printf("stack underflow\n");
			} else {
				a = stack[--top];
				b = stack[--top];
				if(a == 0) {
					printf("division by zero exception\n");
					stack[top++] = b;
				} else {
					stack[top++] = b / a;
				}
			}
		} else if(!strcmp(line, "=")) {
			if(top == 0) {
				printf("stack underflow\n");
			} else {
				if(stack[top-1] < 0 || stack[top-1] > 4999) {
					printf("out of range exception\n");
				} else {
					changeToRoman(stack[top-1], roman);
					printf("%s\n", roman);
				}
			}
		} else {
			stack[top++] = changeToNumber(line);
		}
	}
	
	return 0;
}

int changeToNumber(char *line) 
{
	int value = 0, len = strlen(line);
	int i, a, b;
	
	line[len++] = 'Z';
	line[len] = '\0';
	for(i = 1; i < len; i++) {
		a = romanValue(line[i]);
		b = romanValue(line[i-1]);
		if(b < a) {
			value -= b;
		} else {
			value += b;
		}
	}
	return value;
}
void changeToRoman(int n, char *roman)
{
	int len = 0;
	cycSub(&n, roman, &len, 1000);
	oneSub(&n, roman, &len, 1000, 100);
	cycSub(&n, roman, &len, 500);
	oneSub(&n, roman, &len, 500, 100);
	cycSub(&n, roman, &len, 100);
	oneSub(&n, roman, &len, 100, 10);
	cycSub(&n, roman, &len, 50);
	oneSub(&n, roman, &len, 50, 10);
	cycSub(&n, roman, &len, 10);
	oneSub(&n, roman, &len, 10, 1);
	cycSub(&n, roman, &len, 5);
	oneSub(&n, roman, &len, 5, 1);
	cycSub(&n, roman, &len, 1);
	roman[len] = 0;
}
void cycSub(int *n, char *r, int *l, int sub)
{
	char c = arabValue(sub);
	while(*n >= sub) {
		*n -= sub;
		r[(*l)++] = c;
	}
}
void oneSub(int *n, char *r, int *l, int sa, int sb)
{
	char ca = arabValue(sa);
	char cb = arabValue(sb);
	if(*n >= sa - sb) {
		*n -= sa - sb;
		r[(*l)++] = cb;
		r[(*l)++] = ca;
	}
}
int romanValue(char v)
{
	switch(v) {
	case 'Z':
		return 0;
	case 'I':
		return 1;
	case 'V':
		return 5;
	case 'X':
		return 10;
	case 'L':
		return 50;
	case 'C':
		return 100;
	case 'D':
		return 500;
	default:
		return 1000;
	}
}
char arabValue(int v)
{
	switch(v) {
	case 1000:
		return 'M';
	case 500:
		return 'D';
	case 100:
		return 'C';
	case 50:
		return 'L';
	case 10:
		return 'X';
	case 5:
		return 'V';
	default:
		return 'I';
	}
}

⌨️ 快捷键说明

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