题解:P1603 斯诺登的密码
Quiet_Little_Girl · · 题解
题意:
读入一句话,找出其中的英文数字,用它们的平方模
思路:
- 打表枚举每一个英文数字;
- 输入这句话:其实就是输入几个字符串,当字符串为
.时结束; - 处理字符串:判断是否为英文数字,并存入数组;
- 输出:求最小密码也就是将这些数从小到大输出,所以先给数组排序,然后按
2 位输出(首位直接输出); - 特判:如果没有英文数字,则输出
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;
}