[PAT 乙级] 1044 火星数字 (20 分)——(STL的使用)(内附测试点2,4)2021-08-04


在这里插入图片描述
很简单,但是有个坑
测试点错误原因
测试点1 考察的是输入数字0 能否正常打印
测试点2 4 考察的是13的倍数。火星文只有高位比如十进制的130,转成13进制应该是A0表示,但由于火星数字十位有单独的表达方式,故不需要个位0占位,所以如果只剩一个个位0是不需要翻译的。

多学习一下柳神的简洁代码,func2分类查找真是太妙了

My Code

#include<iostream>
#include<string>
using namespace std;
int findnum(string s, string a[], string b[]);//学习怎么把数组写入函数中
int findnum(string s, string a[], string b[]) {
    for (int m = 0; m < 13; m++) { if (a[m] == s) { return m; break; } }
    for (int m = 0; m < 13; m++) { if (b[m] == s) { return m * 13; break; } }
}
int main() {
    int n;
    cin >> n;
    string a[13] = { "tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug","sep", "oct", "nov", "dec" };
    string b[13] = { "####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo","syy", "lok", "mer", "jou" };
    getchar();//必须隔着for
    for (int i = 0; i < n; i++) {
        string s;
        getline(cin, s);//????为毛,真tm神奇??????
        if (isdigit(s[0])) {
            int temp;
            temp = stoi(s);
            if (b[temp / 13] == "####") cout << a[temp % 13] << endl;
            else if(a[temp % 13]=="tret") cout << b[temp / 13] <<endl;
            else cout << b[temp / 13] + " " + a[temp % 13] << endl;
        }
        else {
            //想想办法,把这玩意分开
            if (s.length() > 4) {
                string t1, t2;
                for (int j = 0; j < s.length(); j++) {
                    //写笔记,定义j,用的是i
                    if (s[j] == ' ') { t1 = s.substr(0, j); t2 = s.substr(j + 1, s.length() - 1); }
                }
                cout << findnum(t1, a, b) + findnum(t2, a, b) << endl;
            }
            else { cout << findnum(s, a, b) << endl; }
        }
    }
    return 0;
}

柳神代码

分析:因为给出的可能是数字(地球⽂)也有可能是字⺟(⽕星⽂),所以⽤字符串s保存每⼀次的输
⼊,因为如果是⽕星⽂则会出现空格,所以⽤getline接收⼀⾏的输⼊~计算string s的⻓度len,判断
s[0]是否是数字,如果是数字,表示是地球⽂,则需要转为⽕星⽂,执⾏func1();如果不是数字,则说
明是⽕星⽂,需要转为地球⽂,执⾏func2();

func2()中,t1和t2⼀开始都赋值0,s1和s2⽤来分离⽕星⽂单词,因为⽕星⽂字符串只可能⼀个单词或者两个单词,而且⼀个单词不会超过4,所以先将⼀个单词的赋值给s1,即s1 = s.substr(0, 3);如果len> 4,就将剩下的⼀个单词赋值给s2,即s2 = s.substr(4, 3);然后下标j从1到12遍历a和b两个数组,如果
a数组中有和s1或者s2相等的,说明低位等于j,则将j赋值给t2;如果b数组中有和s1相等的(b数组不会和s2相等,因为如果有两个单词,s2只可能是低位),说明高位有值,将j赋值给t1,最后输出t1 *13 + t2即可~

#include <iostream>
#include <string>
using namespace std;
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug",
"sep", "oct", "nov", "dec"};
string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo",
"syy", "lok", "mer", "jou"};
int n;
string s;
void func1(int t) {
    if(t/13) {
        if(t%13==0) cout<<b[t/13];
        else cout<<b[t/13]<<" "<<a[t%13];
    }
    else cout<<a[t];
}
void func2() {
    int t1 = 0, t2 = 0;
    string s1 = s.substr(0, 3), s2;
    if (s.length() > 4) s2 = s.substr(4, 3);
    for (int j = 1; j <= 12; j++) {
        //s1在a[]b[]数组中都要找(因为可能没有s2,),s2只需要在a[]中找,因为s2只可能是低位。
        if (s1 == a[j] || s2 == a[j]) t2 = j;
        if (s1 == b[j]) t1 = j;
 }
 cout << t1 * 13 + t2;
}

int main(){
    cin>>n;
    getchar();
    for(int i=0;i<n;i++){
        getline(cin,s);
        if (s[0] >= '0' && s[0] <= '9') func1(stoi(s));
        else func2();
        cout << endl;
    }
    return 0;
}

二刷代码

#include <iostream>
#include <string>
using namespace std;
string a[13] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug",
"sep", "oct", "nov", "dec"};
string b[13] = {"####", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo",
"syy", "lok", "mer", "jou"};
string change(string s){
    if(isdigit(s[0])){
        if(s.size()==1) return a[stoi(s)];
        if(a[stoi(s)%13]=="tret") return b[stoi(s)/13];//测试点4的问题
        else if(b[stoi(s)/13]=="####") return a[stoi(s)%13];//测试点2的问题
        else return b[stoi(s)/13]+" "+a[stoi(s)%13];
    }else{
        if(s.size()>4){
            int t1=0;
            for(int i=0;i<13;i++) if(s.substr(0,3)==b[i]) t1+=i*13;
            for(int i=0;i<13;i++) if(s.substr(4)==a[i]) t1+=i;
            return to_string(t1);
        }else{
            int t2;
            for(int i=0;i<13;i++) if(s.substr(0)==b[i]) {t2+=i*13;return to_string(t2);}
            for(int i=0;i<13;i++) if(s.substr(0)==a[i]) {t2+=i;return to_string(t2);}
        }
    }
}
int main(){
    int n;
    cin>>n;
    getchar();
    for(int i=0;i<n;i++){
        string temp;
        getline(cin,temp);
        cout<<change(temp)<<endl;
    }
    return 0;
}

测试点

输入:

4
13
26
10
20

标准输出:

tam
hel
oct
tam jly
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值