【洛谷 P1603】斯诺登的密码

斯诺登的密码

方法

  • 使用map做字典,解析出单词与数字的对应关系
  • 使用sort排序,然后按照条件输出

代码

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

map<string, int> m;         //字典,用于存储单词对应的数值 
int num[10], cnt = 0;       //num存储从单词中分析出的数字,cnt表示数字个数 

int main()
{
    //将单词对应的数字存入map 
    m["one"] = 1;
    m["two"] = 2;
    m["three"] = 3;
    m["four"] = 4;
    m["five"] = 5;
    m["six"] = 6;
    m["seven"] = 7;
    m["eight"] = 8;
    m["nine"] = 9;
    m["ten"] = 10;
    m["eleven"] = 11;
    m["twelve"] = 12;
    m["thirteen"] = 13;
    m["fourteen"] = 14;
    m["fifteen"] = 15;
    m["sixteen"] = 16;
    m["seventeen"] = 17;
    m["eighteen"] = 18;
    m["nineteen"] = 19;
    m["twenty"] = 20;
    m["a"] = 1;
    m["both"] = 2;
    m["another"] = 1;
    m["second"] = 2;
    m["first"] = 1;
    m["third"] = 3;

    string str;
    for(int i = 0; i < 7; i++){                     //6个单词加1个句号 
        cin >> str;                                 //输入数据 
        if(m.count(str) == 1){                      //若是表示数字的单词 
            num[cnt++] = (m[str] * m[str]) % 100;   //存入cum,并统计个数 
        }
    }

    sort(num, num+cnt); //从小到大排列所有的数据 

    int pos = 0;        //记录从哪一位开始不是0 
    //将pos指向第一个不是0的数,小于cnt防止越界(回RE) 
    for(; pos < cnt && num[pos] == 0; pos++);   
    for(int i = pos; i < cnt; i++){             //从不是0的位置开始输出 
        if(i != pos && num[i] < 10){            //不是第1个并且小于10
            cout << 0;                          //就输出0  
        }
        cout << num[i];                         //否则直接输出原数 
    }
    if(pos == cnt){                             //若所有数都为0(测试点3) 
        cout << 0;                              //就直接输出0 
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Side__/article/details/82285459