📄 1312.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 + -