1044. 火星数字(20)

火星人是以13进制计数的:

  • 地球人的0被火星人称为tret。
  • 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
  • 火星人将进位以后的12个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou。

例如地球人的数字“29”翻译成火星文就是“hel mar”;而火星文“elo nov”对应地球数字“115”。为了方便交流,请你编写程序实现地球和火星数字之间的互译。

输入格式:

输入第一行给出一个正整数N(<100),随后N行,每行给出一个[0, 169)区间内的数字 —— 或者是地球文,或者是火星文。

输出格式:

对应输入的每一行,在一行中输出翻译后的另一种语言的数字。

输入样例:
4
29
5
elo nov
tam
输出样例:
hel mar
may
115
13

#include <iostream>
#include <stdio.h>
#include <map>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    map<int , string > m;
    map<int , string >::iterator it;
    m.insert(pair<int, string > (0,"tret"));
    m.insert(pair<int, string > (1,"jan" ));
    m.insert(pair<int, string > (2,"feb" ));
    m.insert(pair<int, string > (3,"mar" ));
    m.insert(pair<int, string > (4,"apr" ));
    m.insert(pair<int, string > (5,"may" ));
    m.insert(pair<int, string > (6,"jun" ));
    m.insert(pair<int, string > (7,"jly" ));
    m.insert(pair<int, string > (8,"aug" ));
    m.insert(pair<int, string > (9,"sep" ));
    m.insert(pair<int, string > (10,"oct"));
    m.insert(pair<int, string > (11,"nov"));
    m.insert(pair<int, string > (12,"dec"));
    map<int , string > _m;
    map<int , string >::iterator _it;
    _m.insert(pair<int, string > (1,"tam" ));
    _m.insert(pair<int, string > (2,"hel" ));
    _m.insert(pair<int, string > (3,"maa" ));
    _m.insert(pair<int, string > (4,"huh" ));
    _m.insert(pair<int, string > (5,"tou" ));
    _m.insert(pair<int, string > (6,"kes" ));
    _m.insert(pair<int, string > (7,"hei" ));
    _m.insert(pair<int, string > (8,"elo" ));
    _m.insert(pair<int, string > (9,"syy" ));
    _m.insert(pair<int, string > (10,"lok"));
    _m.insert(pair<int, string > (11,"mer"));
    _m.insert(pair<int, string > (12,"jou"));


    map<string , int  > p;
    map<string , int  >::iterator ip;
    p.insert(pair<string,int  > ("tret",0));
    p.insert(pair<string,int  > ("jan", 1));
    p.insert(pair<string,int  > ("feb", 2));
    p.insert(pair<string,int  > ("mar", 3));
    p.insert(pair<string,int  > ("apr", 4));
    p.insert(pair<string,int  > ("may", 5));
    p.insert(pair<string,int  > ("jun", 6));
    p.insert(pair<string,int  > ("jly", 7));
    p.insert(pair<string,int  > ("aug", 8));
    p.insert(pair<string,int  > ("sep", 9));
    p.insert(pair<string,int  > ("oct",10));
    p.insert(pair<string,int  > ("nov",11));
    p.insert(pair<string,int  > ("dec",12));
    map<string, int  > _p;
    map<string, int  >::iterator _ip;
    _p.insert(pair<string,int  > ("tam",1 ));
    _p.insert(pair<string,int  > ("hel",2 ));
    _p.insert(pair<string,int  > ("maa",3 ));
    _p.insert(pair<string,int  > ("huh",4 ));
    _p.insert(pair<string,int  > ("tou",5 ));
    _p.insert(pair<string,int  > ("kes",6 ));
    _p.insert(pair<string,int  > ("hei",7 ));
    _p.insert(pair<string,int  > ("elo",8 ));
    _p.insert(pair<string,int  > ("syy",9 ));
    _p.insert(pair<string,int  > ("lok",10));
    _p.insert(pair<string,int  > ("mer",11));
    _p.insert(pair<string,int  > ("jou",12));

    int n;
    cin>>n;
    //cin.sync();
    //getchar();
    cin.ignore(255,'\n');

    string *st=new string [n];
    for(int i=0;i<n;i++)
    {
        getline(cin,st[i]);
    }

    for(int i=0;i<n;i++)
    {
        bool flag=0;
        if(st[i][0]>='0' && st[i][0]<='9')     //如果字符串第一个字符是数字,则输入的是个数字
            flag=1;
        if(flag==1)
        {
            int temp,t1,t2;
            stringstream ss(st[i]);
            //ss<<st;
            ss>>temp;
            t1=temp / 13;
            t2=temp % 13;

             if(t1>0 &&t2==0)
            {
                _it=_m.find(t1);
                cout<<_it->second;
                //flag=0;
            }
            else if(t1>0 && t2>0)
            {
                _it=_m.find(t1);
                cout<<_it->second<<" ";
                it=m.find(t2);
                cout<<it->second;
                //flag=0;
            }
            else              //t1=0,t2>0
            {
                it=m.find(t2);
                cout<<it->second;
                //flag=0;
            }
        }
        else   //flag=0,说明输入的是火星文
        {
            string st1,st2;
            stringstream ss(st[i]);
            getline(ss,st1,' ');
            getline(ss,st2,' ');
             if(st2.empty())
            {
                ip=p.find(st1);
                _ip=_p.find(st1);
                if(_ip!=_p.end())
                    cout<<_ip->second*13;
                else
                    cout<<ip->second;
            }
            else
            {
                _ip=_p.find(st1);
                ip=p.find(st2);
                cout<<_ip->second*13+ip->second;
            }
        }
        if(i!=n-1)
            cout<<endl;
    }
    return 0;
}

 Aden:看到字符串与数字相对应,我觉得map的键-值应该很适合,自己也没用过,所以就试了,然而我没想到的是map的find方法只能查找key,而无法查找value(其实也可以,但是实现起来比较麻烦),所以我只得写了两组map,所以代码前面很长。。。。还有一点,cin缓冲流要处理好,需要用getchar()或cin.ignore()来清楚输入n 后在缓冲区里的\n,否则,下次使用getline(cin, )时会默认第一次为空

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

int main(){
    char lownum[13][5] = {"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"};
    char highnum[13][5] = {"tret", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"};
    int N;
    scanf("%d", &N);
    getchar();
    for(int i=0; i<N; ++i){
        char str[10];
        gets(str);
        if(str[0]>='0' && str[0]<='9'){
            int num = 0;
            for(int j=0; str[j]!='\0'; ++j){
                num = num*10 + str[j] - '0';
            }
            if(num/13){
                if(num%13){
                    printf("%s ", highnum[num/13]);
                    printf("%s\n", lownum[num%13]);                 
                }else{
                    printf("%s\n", highnum[num/13]);
                }
            }else{
                printf("%s\n", lownum[num%13]);
            }
        }else{
            int num = 0;
            for(int j=1; j<13; ++j){
                if( strstr(str, highnum[j]) ){
                    num += 13*j;
                    break;
                }
            }
            for(int j=0; j<13; ++j){
                if( strstr(str, lownum[j]) ){
                    num += j;
                    break;
                }
            }
            printf("%d\n", num);
        }       
    }

    return 0;
}

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
    const char a[][10] = {"tret", "jan", "feb", "mar", "apr", "may", "jun",
                          "jly", "aug", "sep", "oct", "nov", "dec"
                         };
    const char b[][10] = {"tam", "hel", "maa", "huh", "tou", "kes", "hei",
                          "elo", "syy", "lok", "mer", "jou"
                         };
    int T, mark = 0, mark1, mark2 , mark3;
    cin >> T;
    getchar();
    char temp[20];
    while (T--)
    {
        memset(temp, 0, sizeof(temp));
        gets(temp);
        if (isdigit(temp[0]))
        {
            for (int i = 0; temp[i] != '\0'; i++)
                mark = mark * 10 + temp[i] - '0';

            if (mark <= 12)
                cout << a[mark] << endl;
            else if (mark % 13 == 0)
                cout << b[mark / 13 - 1] << endl;
            else
                cout << b[mark / 13 - 1] << " " << a[mark % 13] << endl;
            mark = 0;
        }

        else if (islower(temp[0]))
        {
            char temp1[4], temp2[4], temp3[4];
            memset(temp1, 0, sizeof(temp1));
            memset(temp2, 0, sizeof(temp2));
            memset(temp3, 0, sizeof(temp3));
            mark1 = mark2 = mark3 = -1;

            for (int i = 0; i < 3; i++)
            {
                temp1[i] = temp[i]; 
                temp2[i] = temp[i + 4];  
                temp3[i] = temp[i];
            }

            for (int i = 0; i <= 12; i++)
            {
                if (strcmp(a[i], temp2) == 0)
                    mark1 = i;
                if (strcmp(b[i], temp1) == 0)
                    mark2 = i;
                if (strcmp(a[i], temp3) == 0)
                    mark3 = i;
            }

            if (mark3 != -1)
            {
                cout << mark3 << endl;
                continue;
            }

            if (mark1 == -1)
                cout << (mark2 + 1) * 13 + mark1 + 1 << endl;

            else
                cout << (mark2 + 1) * 13 + mark1 << endl;
        }
    }
}

Aden:还是二维数组更简单。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值