1044. 火星数字(20)

原题: https://www.patest.cn/contests/pat-b-practise/1044

思路: 首先解决读取一行数据的问题, 我在这里使用的是%[^\n]. 再配合
sscanf把字符串或者数字提取出来.

接下来就要对拿到的数据进行正确分类, 我的分类是

  1. 数字0
  2. 数字小于13
  3. 数字大于13并且是13的整数倍
  4. 数字大于13并且不是13的整数倍
  5. 字符串tret
  6. 字符串是2位数
  7. 字符串是1位数

实现:

#include <stdio.h>
#include <string.h>

#define LEN 20
char unit[LEN][LEN] = {
    "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"
};
char ten[LEN][LEN] = {
    "tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou",
};

int getUnit (char str[]);
int getTen (char str[]);

int main (void) {
    int dec = 13;   // 进制
    int n;
    char tmp[LEN];  // 存储一行字符串
    int num;        // 保存数字
    char str1[LEN]; // 火星字符串1
    char str2[LEN]; // 火星字符串2
    int i;

    scanf("%d", &n);
    getchar(); // 挡掉Enter
    for (i = 0; i < n; i++) {
    	num = 0;
        scanf("%[^\n]", tmp);
        getchar(); // 挡掉Enter
        if (tmp[0] >= '0' && tmp[0] <= '9') {
            sscanf(tmp, "%d", &num); // 从字符串里提取数字
            if (num == 0) {
                printf("tret\n");
            } else if (num < dec) {
				printf("%s\n", unit[num]);			
			} else if (num / dec != 0 && num % dec == 0) {
                printf("%s\n", ten[num / dec]);
            } else {
                printf("%s %s\n", ten[num / dec], unit[num % dec]);
            }
        } else if (strcmp(tmp, "tret") == 0) {
            printf("0\n");
        } else if (strlen(tmp) > 6) {
            sscanf(tmp, "%s %s", str1, str2);
            num += getTen(str1) * dec;
            num += getUnit(str2);
            printf("%d\n", num);
        } else {
            if (getTen(tmp) != -1) {
                num = getTen(tmp) * 13;
                printf("%d\n", num);
            } else {
                num = getUnit(tmp);
                printf("%d\n", num);
            }
        }
    }

	return 0;
}

int getTen (char str[]) {
    int i;
    for (i = 0; i < 13; i++) {
        if (strcmp(str, ten[i]) == 0) return i;
    }
    return -1;
}

int getUnit (char str[]) {
    int i;
    for (i = 0; i < 13; i++) {
        if (strcmp(str, unit[i]) == 0) return i;
    }
    return -1;
}

posted @ 2017-12-05 16:39  阿胜4K  阅读(369)  评论(0编辑  收藏  举报