问题描述
对于输入的字符串(只包含字母和数字),将其中的连续数字拼接成整数,然后将这些整数按从大到小顺序输出。例如字符串“abc123d5e7f22k9”中共有5个数字123,5,7,22,9,因此应输出123 22 9 7 5。
输入说明
输入为一个字符串,字符串长度不超过100,其中最长的连续数字不超过10个,字符串中至少包含1个数字。
输出说明
对于输入的字符串,在一行上输出排序结果,整数间以一个空格间隔。
输入样例
abc123d5e7f22k9
输出样例
123 22 9 7 5
第一版本
#include<stdio.h>
#include<string.h>
int main()
{char a[100]={'\0'};
int b[100]={0};
int i,j,c,count=0,flag=0;
gets(a);
for(i=0;a[i]!='\0';i++)
{if(a[i]>='0'&&a[i]<='9')
{
c=10*c+a[i]-'0';
flag=1;
if(a[i+1]=='\0')
{b[count++]=c;
}
}
else if(a[i]>='a'&&a[i]<='z'&&flag==1)
{b[count++]=c;
c=0;
}
else flag=0;
}
int temp;
for(i=0;i<count-1;i++)
for(j=0;j<count-i-1;j++)
{if(b[j]<b[j+1])
{temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
for(i=0;i<count;i++)
printf("%d ",b[i]);
return 0;
}
得分75
修改了一下
#include<stdio.h>
#include<string.h>
int main() {
char a[100] = {'\0'};
int b[100] = {0};
char test[1] = {'a'};
int i, j, count = 0, flag = 0;
gets(a);
strlwr(a); // 将字符串转换为小写字母
strcat(a, test); // 在字符串末尾添加一个字符确保最后一个数字能够被处理
for (i = 0; a[i] != '\0'; i++) {
if (a[i] >= '0' && a[i] <= '9') {
b[count] = 10 * b[count] + a[i] - '0';
flag = 1;
}
if (a[i] >= '0' && a[i] <= '9') {
if (a[i + 1] >= 'a' && a[i + 1] <= 'z') {
count++;
}
}
}
int temp = 0;
for (i = 0; i < count - 1; i++)
for (j = 0; j < count - i - 1; j++)
if (b[j] < b[j + 1]) {
temp = b[j];
b[j] = b[j + 1];
b[j + 1] = temp;
}
for (i = 0; i < count; i++)
printf("%d ", b[i]);
return 0;
}
主要修改和优化:
- 添加注释,以解释代码中每个部分的功能和作用。
- 使用
strlwr
函数将字符串转换为小写字母,以确保对字母的比较不受大小写影响。 - 在字符串末尾添加一个字符确保最后一个数字能够被处理。
- 将对数字的处理部分进行优化,使得代码更加清晰和简洁。