题解:P1603 斯诺登的密码

· · 题解

这其实是一道很的题, 我们只需要用字符串就可以了。

我们并不用和题目描述的一样,写完后对 100 取余,可以直接打表,这样会很方便,用 a 字符串存入可能输入的 26 个英文的数字,b 数组来判断 a 中数字的平方对 100 取余后的数字是几,再去 0 输出就可以了。

详见代码

#include<bits/stdc++.h>
using namespace std;
string a[30] = {"" , "one" , "two" , "three" , "four" , "five" , "six" , "seven" , "eight" , "nine" , "ten" , "eleven" , "twelve" , "thirteen" , "fourteen" , "fifteen" , "sixteen" , "seventeen" , "eighteen" , "nineteen" , "twenty" , "a" , "both" , "another" , "first" , "second" , "third"}; 
//打表 
int b[30] = {0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 , 0 , 21 , 44 , 69 , 96 , 25 , 56 , 89 , 24 , 61 , 0 , 1 , 4 , 1 , 1 , 4 , 9};
//a[i]对应数字^ 2 % 2 得到的数字 
int main () {
    int k = 0 , x[9178];
    for (int i = 1;i <= 6;i ++){//输入6个单词 
        string y;
        cin >> y;
        for (int j = 1;j <= 26;j ++){//看看y对应26个数字中的哪一个 
            if(a[j] == y){
                k ++; //k用来统计有多少个英文数字 
                x[k] = b[j];//x存储阿拉伯数字 
                break;//跳出循环 
            }
        }
    }
    if(k == 0){
        cout << 0;//特判,如果没有数字那就输出0 
        return 0;
    }
    sort(x + 1 , x + k + 1);//排序,让最后得出的是最小值 
    for (int i = 1;i <= k;i ++){
        if(i != 1 && x[i] < 10) {
            cout << 0;//补0 
        }
        cout << x[i];//输出 
    }
    return 0;//完美收场
}