Problem F: 该按哪些键
Description
Peter在手机上打字时一直用全键键盘来输入,但最近不知道怎么搞的,把全键键盘弄丢了,只剩下了9键键盘。一项喜欢高科技的Peter却不会用9键键盘打字。So,please help him!
9键键盘如上图所示。如果要输入字母'A',我们只需要按一次数字键2;如果要输入空格,则需要按数字键0;如果要输入字母'B'的话,我们需要连续按两次数字键2,按键序列为22。如果要输入的两个大写字母都在同一个数字键上,则需要按数字1作为分隔符,例如输入字母’JL’,需要先按一次数字键5,再按一次数字键1,再按3次数字键5,按键序列为51555。
为了使问题简化,我们假设Peter要输入的内容只有大写英文字母和空格。
Input
输入有多组测试用例。每组测试用例占一行,为Peter要输入的内容,不超过20000个字符。
Output
对于每组测试用例,输出一行,为得到所有内容所要按下的按键序列。
Sample Input
I LOVE YOU HELLO WORLD
Sample Output
444055566688833099966688 44335551555666096667775553
HINT
Append Code
答案:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
prentf(char *s,int len)
{
int i,j;//I LOVE YOU
for(i=0;i<len;i++)
{
if(s[i] >= 'A'&&s[i] <= 'C')//2
{
if(s[i]-s[i-1] <= 2&&s[i-1] >= 'A'&&s[i-1] <= 'C')
printf("1");
for(j = 0;j<=s[i]-'A';j++)
printf("2");
}
if(s[i] >= 'D'&&s[i] <= 'F')//3
{
if(s[i]-s[i-1] <= 2&&s[i-1] >= 'D'&&s[i-1] <= 'F')
printf("1");
for(j = 0;j<=s[i]-'D';j++)
printf("3");
}
if(s[i] >= 'G'&&s[i] <= 'I')//4
{
if(s[i]-s[i-1] <= 2&&s[i-1] >= 'G'&&s[i-1] <= 'I')
printf("1");
for(j = 0;j<=s[i]-'G';j++)
printf("4");
}
if(s[i] >= 'J'&&s[i] <= 'L')//5
{
if(s[i]-s[i-1] <= 2&&s[i-1] >= 'J'&&s[i-1] <= 'L')
printf("1");
for(j = 0;j<=s[i]-'J';j++)
printf("5");
}
if(s[i] >= 'M'&&s[i] <= 'O')//6
{
if(s[i]-s[i-1] <= 2&&s[i-1] >= 'M'&&s[i-1] <= 'O')
printf("1");
for(j = 0;j<=s[i]-'M';j++)
printf("6");
}
if(s[i] >= 'P'&&s[i] <= 'S')//7
{
if(s[i]-s[i-1] <= 3&&s[i-1] >= 'P'&&s[i-1] <= 'S')
printf("1");
for(j = 0;j<=s[i]-'P';j++)
printf("7");
}
if(s[i] >= 'T'&&s[i] <= 'V')//8
{
if(s[i]-s[i-1] <= 2&&s[i-1] >= 'T'&&s[i-1] <= 'V')
printf("1");
for(j = 0;j<=s[i]-'T';j++)
printf("8");
}
if(s[i] >= 'W'&&s[i] <= 'Z')//9
{
if(s[i]-s[i-1] <= 3&&s[i-1] >= 'W'&&s[i-1] <= 'Z')
printf("1");
for(j = 0;j<=s[i]-'W';j++)
printf("9");
}
if(s[i] == ' ')
printf("0");
}
printf("\n");
}
int main()
{
char *s;
char ch[10001];
int n,i,len;
scanf("%d",&n);
while(gets(ch))
{
len = strlen(ch);
s = (char*)malloc(len*sizeof(char)+1);
strcpy(s,ch);
prentf(s,len);
}
}