挑剔的小杜
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描写叙述
小杜一直都不喜欢数学,可是他特爱语文,所以对英语也很感兴趣。所以他也就有个习惯,一看到字母里面插有数字,一定要把他所有划去。
如今给你纸,纸上有非常多既含有字母,又含有数字的句子(还包含一些标点符号)。你须要将数字找出来放在一边,并组成一个最大的数。然后逆序输出全部字母。和那个最大的数。
输入
第一行:N表示有多少组数据。
接下来的N行。每行有一句话。长度不超过1000。
输出
每句话相应输出两行。
第一行输出字母的总个数及其全部的字母(按原来输入的相反的顺序输出),中间须要一个空格分开。
第二行输出那个数字的总个数及最大的数,中间须要一个空格分开。
(假设没有字母或数字,则相应仅仅须要输出一个0)
例子输入
2
abcabc123abc.
aaa
例子输出
9 cbacbacba
3 321
3 aaa
0
代码1:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int com(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main(void)
{
int n;
scanf("%d",&n);
while(n--)
{
char str[1000],ch[1000];
int num[1000];
int count1=0,count2=0;
scanf("%s",str);
int j=0,k=0;
for(int i=0;i<strlen(str);i++)
{
if(str[i]>='0'&&str[i]<='9')
{
num[j++]=str[i]-'0';
count1++;
}
if(str[i]>='a'&&str[i]<='z')
{
ch[k++]=str[i];
count2++;
}
}
num[j]=' ';
ch[k]=' ';
qsort(num,count1,sizeof(num[0]),com);
if(count2!=0)
{
printf("%d ",count2);
for(int j=count2-1;j>=0;j--)
{
printf("%c",ch[j]);
}
printf("
");
}
else
{
printf("0
");
}
if(count1!=0)
{
printf("%d ",count1);
for(int j=count1-1;j>=0;j--)
{
printf("%d",num[j]);
}
printf("
");
}
else
{
printf("0
");
}
}
return 0;
}
代码2:
#include<stdio.h>
int num[1003];
char str[1003];
int main()
{
int n=0,k=0,t=0,i,j,a,b=1;
char ch;
scanf("%d",&n);
getchar();
while(n--)
{
for(i=0;i<=1003;i++)
num[i]=0;
j=0;
i=0;
while((ch=getchar())!='
')
{
if(ch>='0'&&ch<='9')
{
num[i++]=ch-'0';
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
str[j++]=ch;
}
}
str[j]=' ';
for(k=1;k<i;k++)
{
for(a=0;a<i-k;a++)
{
if(num[a]<num[a+1])
{
t=num[a];
num[a]=num[a+1];
num[a+1]=t;
}
}
}
printf("%d ",j);
for(k=j-1;k>=0;k--)
printf("%c",str[k]);
printf("
%d ",i);
for(k=0;k<i;k++)
printf("%d",num[k]);
printf("
");
}
}