《编程思维与实践》1048.解密字符串
题目
思路
主要到密码是升序的,所以先将每个数字对应的个数求出,之后升序排列输出即可得到结果.
求每个数字(0-9)对应的个数可以考虑每个英文单词中特有的字符(出现单次),
zero,one,two,three,four,five,six,seven,eight,nine;
下面提供其中一种可行的方案:
z为0特有, w为2特有,u为4特有, x为6特有, g为8特有;
o在0,1,2,4中都有出现, 可以通过0,2,4求出1的个数;
h在3,8中都有出现, 可以通过8求出3的个数;
f在4,5中都有出现,可以通过4求出5的个数;
v在5,7中都有出现, 可以通过5求出7的个数;
i在5,6,8,9中都有出现,可以通过5,6,8求出9的个数.
代码
#include<stdio.h>
#include<string.h>
typedef struct{int number;} Data;
int main()
{
int T;
scanf("%d",&T);
for(int t=0;t<T;t++)
{
char s[21];
scanf("%s",s);
Data tab[10]; //记录0-9对应数字的个数
int a[128]={0}; //记录每个字母出现的次数
memset(tab,0,sizeof(tab));
for(int i=0;i<strlen(s);i++)
{
a[s[i]]++;
}
tab[0].number=a['Z'];
tab[2].number=a['W'];
tab[4].number=a['U'];
tab[6].number=a['X'];
tab[8].number=a['G'];
tab[1].number=a['O']-tab[0].number-tab[2].number-tab[4].number;
tab[3].number=a['H']-tab[8].number;
tab[5].number=a['F']-tab[4].number;
tab[7].number=a['V']-tab[5].number;
tab[9].number=a['I']-tab[5].number-tab[6].number-tab[8].number;
printf("case #%d:\n",t);
for(int i=0;i<10;i++) //直接在循环中就可保证升序
{
if(tab[i].number!=0) //出现该数字
{
for(int j=0;j<tab[i].number;j++) //按次数输出
{
printf("%d",i);
}
}
}
printf("\n");
}
return 0;
}