题解:P1603 斯诺登的密码

· · 题解

题意:

读入一句话,找出其中的英文数字,用它们的平方模 100 后组成密码(一个数),求最小的数。

思路:

  1. 打表枚举每一个英文数字;
  2. 输入这句话:其实就是输入几个字符串,当字符串为 . 时结束;
  3. 处理字符串:判断是否为英文数字,并存入数组;
  4. 输出:求最小密码也就是将这些数从小到大输出,所以先给数组排序,然后按 2 位输出(首位直接输出);
  5. 特判:如果没有英文数字,则输出 0

    代码

#include<bits/stdc++.h>
using namespace std;
string s;
string num[25]{" ","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty"};
//正规数字直接对应下标 
string unum[8]={"a","both","another","first","second","third"};
int unnum[8]={1,2,1,1,2,3};
//非正规数字需要另外开一个int数组 
int a[20],cnt;//记录数字和数字个数 
bool f=0;//判断是否是首位和是否有数字情况 
int main(){
    while(cin>>s&&s!="."){//输入.时停止 
        for(int i=1;i<=20;i++){
            if(s==num[i]){
                a[++cnt]=pow(i,2);//注意是平方 
                break;
            }
        }//处理正规数字 
        for(int i=0;i<=5;i++){
            if(s==unum[i]){
                a[++cnt]=pow(unnum[i],2);
                break;
            }
        }//处理非正规数字 
    }
    sort(a+1,a+cnt+1);//最小密码即从小到大输出 
    for(int i=1;i<=cnt;i++){
        int x=a[i]%100;//对100取模 
        if(f) printf("%.2d",x);//如果不是首位,按2位输出(借鉴了第一位大佬) 
        else 
            if(a[i]>0) cout<<x,f=1;//是首位,直接输出并标记 
    }
    if(!f) cout<<0;//特判没有数字情况 
    return 0;
}