题解:P1603 斯诺登的密码

· · 题解

思路

这题思路比较简单,输入之后判断其数字,存入数组后从小到大排序输出即可。

对于每个单词对应的数字,我们可以事先计算好再依次对每个单词进行判断。

输出时要注意,输出数字如果不为空则不能为 0,如果该数字小于 10 且不在第一位输出的数字要补 0

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[10], ans, cnt;
string s, c;

void zly(string x) {//函数,逐个判断每一种情况
    if (x == "one" || x == "a" || x == "first" || x == "another")
        a[++cnt] = 1;
    if (x == "two" || x == "both" || x == "second")
        a[++cnt] = 4;
    if (x == "three" || x == "third")
        a[++cnt] = 9;
    if (x == "four")
        a[++cnt] = 16;
    if (x == "five")
        a[++cnt] = 25;
    if (x == "six")
        a[++cnt] = 36;
    if (x == "seven")
        a[++cnt] = 49;
    if (x == "eight")
        a[++cnt] = 64;
    if (x == "nine")
        a[++cnt] = 81;
    if (x == "ten")
        a[++cnt] = 0;
    if (x == "eleven")
        a[++cnt] = 21;
    if (x == "twelve")
        a[++cnt] = 44;
    if (x == "thirteen")
        a[++cnt] = 69;
    if (x == "fourteen")
        a[++cnt] = 96;
    if (x == "fifteen")
        a[++cnt] = 25;
    if (x == "sixteen")
        a[++cnt] = 56;
    if (x == "seventeen")
        a[++cnt] = 89;
    if (x == "eighteen")
        a[++cnt] = 24;
    if (x == "nineteen")
        a[++cnt] = 61;
    if (x == "twenty")
        a[++cnt] = 0;//事先计算好,直接赋值
}

signed main() {
    getline(cin, s);//用getline()输入可以直接读入一整句话
    for (int i = 0; i < s.length() - 1; i++) {
        if (s[i] == ' ') {
            zly(c);
            c = "";
        } else
            c += s[i];//分离字符串,记录每个单词
    }
    sort(a + 1, a + cnt + 1);//给数组从小到大排序
    for (int i = 1; i <= cnt; i++) {
        if ((a[i] != 0 && i == 1) || a[i] != 0) {//判断其不为零
            if (a[i] < 10 && i != 1) {//不到十,要记得补零
                cout << 0;
            }
            cout << a[i];
            ans++;//记录是否输出
        }
    }
    if (ans == 0) {//如果未输出,要输出0
        cout << 0;
    }
    puts("");//换行
    return 0;
}

附上AC记录 。