题目
某人用一串非递减的数字字符表示一个密码(如:001,114,456779等),但经常忘记自己的密码,因此想把密码记录在某个地方。为防止泄密,将数码0到9用全大写的英文单词表示并将所有字母打乱。
例如:密码114表示为ONEONEFOUR,或者OURNEONFOE,FOOONNEERU等。
现在给定一个大写字母表示的字符串,要求算出原来的数字表示的密码。
输入数据保证答案唯一。
思路
考虑到每个英文数字唯一的字符,出现一个对应的字符就对应的字符--
,对应的数字++
,然后基数排序顺序输出即可
代码
#include<iostream>
#include<cstring>
using namespace std;
int alpha[130];
string number[10] =
{ "ZERO","ONE","TWO",
"THREE","FOUR",
"FIVE","SIX",
"SEVEN","EIGHT","NINE"
};
//0 Z
//1 除去其他数字 O
//2 W
//3 把0和4除掉就是R
//4 U
//5 除去4剩F
//6 X
//7 V 除去 5
//8 G
//9 与1差异是I
void trans(string str)
{
memset(alpha,0,520);
int NUM[10] = {0};
int len = str.length();
for(int i = 0; i < len; i++)
{
alpha[str[i]]++;
}
while(alpha['Z'])//0
{
alpha['Z']--;
alpha['E']--;
alpha['R']--;
alpha['O']--;
NUM[0]++;
}
while(alpha['W'])//2
{
alpha['T']--;
alpha['W']--;
alpha['O']--;
NUM[2]++;
}
while(alpha['U'])//4
{
alpha['F']--;
alpha['O']--;
alpha['U']--;
alpha['R']--;
NUM[4]++;
}
while(alpha['F'])//5
{
alpha['F']--;
alpha['I']--;
alpha['V']--;
alpha['E']--;
NUM[5]++;
}
while(alpha['X'])//6
{
alpha['S']--;
alpha['I']--;
alpha['X']--;
NUM[6]++;
}
while(alpha['V'])//7
{
alpha['S']--;
alpha['E']--;
alpha['V']--;
alpha['E']--;
alpha['N']--;
NUM[7]++;
}
while(alpha['G'])//8
{
alpha['E']--;
alpha['I']--;
alpha['G']--;
alpha['H']--;
alpha['T']--;
NUM[8]++;
}
while(alpha['I'])//9
{
alpha['N']--;
alpha['I']--;
alpha['N']--;
alpha['E']--;
NUM[9]++;
}
while(alpha['O'])//1
{
alpha['O']--;
alpha['N']--;
alpha['E']--;
NUM[1]++;
}
while(alpha['R'])//1
{
alpha['T']--;
alpha['H']--;
alpha['E']-=2;
alpha['R']--;
NUM[3]++;
}
for(int i = 0; i < 10 ; i++)
{
while(NUM[i])
{
NUM[i]--;
cout << i ;
}
}
}
int main()
{
int t;
cin >> t;
for(int i = 0; i < t; i++)
{
string str;
cin >> str;
cout << "case #" << i << ":"<<endl;
trans(str);
cout << endl;
}
return 0;
}