问题描述
对于输入的字符串(只包含字母和数字),将其中的连续数字拼接成整数,然后将这些整数按从大到小顺序输出。
例如字符串“abc123d5e7f22k9”中共有5个数字123,5,7,22,9,因此应输出123 22 9 7 5。
输入说明
输入为一个字符串,字符串长度不超过100,其中最长的连续数字不超过10个,字符串中至少包含1个数字。
输出说明
对于输入的字符串,在一行上输出排序结果,整数间以一个空格间隔。
输入样例
abc123d5e7f22k9
输出样例
123 22 9 7 5
.
.
.
这道题的难点在于:在扫描到数字的时候同时也要记录下来,并且要同时把其转化为整形。于是,当我们用i扫描到首数字以后,要创建一个临时往后扫描的tempi,进行一系列的处理。关键程序如下:
for (i=0; i<=len-1; i++)
{
if (x[i]>='0' && x[i]<='9')
{
a++;
int tempi=i;
int templen=0; //记录该数字的字面长度
while (x[tempi]>='0' && x[tempi]<='9') //第一遍扫描字面长度
{
templen++;
tempi++;
}
tempi=i;
i+=templen; //在这里就要让i往后走了
while (x[tempi]>='0' && x[tempi]<='9') //第二遍扫描数字,转成整形
{
zx[k]+=(x[tempi]-'0')*my_pow(templen);
templen--;
tempi++;
}
k++;
}
}
当然,这样写还是比较复杂的。其实不需要扫描出字面长度和创建my_pow函数,可以直接扫到一位录入一位整形数字,每次×10。这个比较简便的算法,我在之前的博客中有写到过。
字符转整形的简便算法https://blog.csdn.net/GalaxyerKw/article/details/110407457
.
.
.
下面是完整的代码:
#include<stdio.h>
#include<string.h>
int my_pow(int n)
{
int i;
int sum=1;
for(i=1; i<=n-1; i++)
{
sum*=10;
}
return sum;
}
void swap (int *x , int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
int main(void)
{
char x[101];
gets(x);
int len=strlen(x);
int i,j;
int zx[100]={0};
int k=0;
int a=0; //记录完整数字段个数
for (i=0; i<=len-1; i++)
{
if (x[i]>='0' && x[i]<='9')
{
a++;
int tempi=i;
int templen=0; //记录该数字的字面长度
while (x[tempi]>='0' && x[tempi]<='9') //第一遍扫描字面长度
{
templen++;
tempi++;
}
tempi=i;
i+=templen; //在这里就要让i往后走了
while (x[tempi]>='0' && x[tempi]<='9') //第二遍扫描数字,转成整形
{
zx[k]+=(x[tempi]-'0')*my_pow(templen);
templen--;
tempi++;
}
k++;
}
}
for (i=0; i<a-1; i++) //bbs
{
for (j=0; j<a-1-i; j++)
{
if (zx[j]<zx[j+1])
{
swap(zx+j,zx+j+1);
}
}
}
for (i=0; i<=a-1; i++)
{
printf("%d ",zx[i]);
}
return 0;
}