Life of xhu

About

过年回家感想 & HOJ_1312

Feb 07, 2014

  |   #随笔   |   #HOJ

曾经以为结婚是一件很遥远的事,好像身边的人里面还只有我有女朋友,可是这次回家,大人们的话题已经变成,谁家的孩子订了婚,谁家的女儿出嫁了。语句里,却都是我熟悉的名字,这才意识到,我们这一代人,终于要开始面对婚姻这个人生中至关重要的难题了。

如果考上研,还有五年的时间。如果没考上,还有三年。不快也不慢,对我来说,这么多的时间足够我去磨平也许会对婚姻造成伤害的棱角。

上次回去的时候,和朋友们的话题,还是DotA,我们说着一次次在游戏中见到的蛋疼事;而这次回去,我们开始聊学业,聊工作,聊也许就在不远的将来的婚姻,我们开始很开诚布公的谈高中,谈女生,我们终于已经和那三年的时光划清了界限,所有的一切都无法在我们心中引起任何波澜,那些难受的难堪的难忘的人和事,现在想起,也只会会心一笑,仅此而已。

不过有意思的是,我们现在再说我们觉得高中班级里最漂亮的,却完全不是高中时觉得漂亮的那几个,我们会评价长相,身材,气质,学历。我发现社会的作用原来就是把一个人的审美观人生观世界观从简单变得复杂,就像我们高中时认定一个女生是不是美女,只看脸蛋就够了,可现在

“如果那个最漂亮的女生脱光了站在我面前,就她那身材,我TM都不会硬。”

朋友的这句话绝对是对我们这三年来审美观变化的最精辟的总结。

天气在异常地热了一个多月之后终于开始降温了,三天内从25度直降到-3度,而且后天就会下雪。2014年的第一场雪在我即将离开九江的时候终于开始准备降下来了,前几天我还和我妈开玩笑,说九江会不会和广东一样,再也不下雪啊,现在看来,这场雪还是命不该绝。

该来的总是要来的,不同的只是时间远近罢了。

决定了,下学期过去开始减肥,去食堂绝不添饭,戒掉好有趣原味薯片,吃油泼面绝不加蛋堡,等天气开始转暖,坚持游泳,坚持长跑,一定要给豆豆一个帅气的老公。

~~~~~~~~~~~~我是萌萌的昏割线~~~~~~~~~~~~~

然后仍然是一道HOJ水题,这道题题意相当简单,就是模拟一个栈,但是输入和输出都用罗马数字,麻烦就麻烦在罗马数字和阿拉伯数字的转换上,题中关于罗马数字的四个要求翻译过来是这个意思:

  • 除了M(1000),不要在一个表达式中三次以上出现同一个字母;

  • 如果要减一个数的话,这个数只能是10的倍数,也就是说,本题中的罗马数字,作为减数的只能是I(1)X(10)C(100);

  • 当使用减法表示一个数时,应将结果表示为两个数相减的形式,或相加的表示,比如,如果用IIX表示8,被减数有两个,是非法表示,应写作VIII;

  • 参与减法的两个罗马数字字母不能相差超过十倍。

代码如下:

//HOJ_1312
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;

typedef struct Stack{
    int val[100];
    int top;    
}Stack;

int ChartoInt(char c){
    switch(c){
        case 'I':
            return 1;
            break;
        case 'V':
            return 5;
            break;
        case 'X':
            return 10;
            break;
        case 'L':
            return 50;
            break;
        case 'C':
            return 100;
            break;
        case 'D':
            return 500;
            break;
        case 'M':
            return 1000;
            break;
        default:
            break;
    }
}

int RomantoInt(char str[]){
    int tmp = 0;
    if(strlen(str) == 1)
        return ChartoInt(str[0]);
    else{
        for(int i = 0; i < strlen(str) - 1; i++){
            if(ChartoInt(str[i]) < ChartoInt(str[i + 1]))
                tmp -= ChartoInt(str[i]);
            else
                tmp += ChartoInt(str[i]);
        }
        tmp += ChartoInt(str[strlen(str) - 1]);
        return tmp;

    }
}

void InttoRoman(int i){
    if(i >= 1000){
        for(int j = 0; j < i / 1000; j++)
            cout << 'M';
    }
    i = i % 1000;

    if(i >= 100){
        if(i / 100 <= 3){
            for(int j = 0; j < i / 100; j++)
                cout << 'C';
        }else if(i / 100 == 4)
            cout << "CD";
        else if(i / 100 >= 5 && i / 100 <= 8){
            cout << 'D';
            for(int j = 0; j < i / 100 - 5; j++)
                cout << 'C';
        }else 
            cout << "CM";
    }
    i = i % 100;

    if(i >= 10){
        if(i / 10 <= 3){
            for(int j = 0; j < i / 10; j++)
                cout << 'X';
        }else if(i / 10 == 4)
            cout << "XL";
        else if(i / 10 >= 5 && i / 10 <= 8){
            cout << 'L';
            for(int j = 0; i < j / 10 - 5; j++)
                cout << 'X';
        }else 
            cout << "XC";
    }
    i = i % 10;

    if(i >= 1){
        if(i / 1 <= 3){
            for(int j = 0; j < i / 1; j++)
                cout << 'I';
        }else if(i / 1 == 4)
            cout << "IV";
        else if(i / 1 >= 5 && i / 1 <= 8){
            cout << 'V';
            for(int j = 0; j < i - 5; j++)
                cout << 'I';
        }else 
            cout << "IX";
    }

    cout << endl;
}

int main(){
    Stack s;
    s.top = -1;
    char input[20];
    while(cin >> input){
        if(input[0] == '+' || input[0] == '-' || input[0] == '*' || input[0] == '/'){
            if (s.top <= 0){
                cout << "stack underflow" << endl;
            }else{
                switch(input[0]){
                    case '+':
                        s.val[s.top - 1] = s.val[s.top] + s.val[s.top - 1];
                        break;
                    case '*':
                        s.val[s.top - 1] = s.val[s.top] * s.val[s.top - 1];
                        break;
                    case '-':
                        s.val[s.top - 1] = s.val[s.top - 1] - s.val[s.top];
                        break;
                    case '/':
                        if(s.val[s.top] == 0)
                            cout << "division by zero exception" << endl;
                        else
                            s.val[s.top - 1] = s.val[s.top - 1] / s.val[s.top];
                        break;
                    default:
                        break;
                }
                s.top--;
            }
        }else if(input[0] == '='){
            if(s.top < 0)
                cout << "stack underflow" << endl;
            else{
                if(s.val[s.top] <= 0 || s.val[s.top] > 4999)
                    cout << "out of range exception" << endl;
                else 
                    InttoRoman(s.val[s.top]);
            }
        }else{
            s.top++;
            s.val[s.top] = RomantoInt(input);
        }
    /*cout << "===== ";
    for(int i = 0; i <= s.top; i++)
    cout << s.val[i] << ' ';
    cout << " ====="<< endl;
    */ 
    }
}