7-14 字符串中的数的显示 (6 分)
输入形如:8,9,6 - 11,20- 25 一行数据,其中 a-b表示 闭区间[a,b](a<=b),然后把这行中对应的数(没有负数与0)从小到大显示出来
,。
输入格式:
第1行输入N(0≤N≤10);第2行开始输入N行数据, 输入一行数据时(一行中字符串的长度不超50),数与数之间,数与闭区间之间,闭区间与闭区间之间用‘,’分割,同时允许在其中出现多个空格 如:20- 25,18 ,19,其中最大的数不超过99。
输出格式:
按输入的顺序依次输出各行对应的数,每行数从小到大的顺序输出所有的数,数与数之间以逗号分隔,最后没有逗号。
输入样例:
在这里给出一组输入。例如:
2
87, 9- 16, 82, 90-92,10-17
3-6 , 13 - 17 ,20
结尾无空行
输出样例:
在这里给出相应的输出。例如:
9,10,11,12,13,14,15,16,17,82,87,90,91,92
3,4,5,6,13,14,15,16,17,20
结尾无空行
#include<stdio.h>
#include<string.h>
void mma(int arr[],int l);
int main()
{
int i,a,l,j,n=0,I,J,k,x,b,e;
char crr[20][1000];int str[10000];
scanf("%d",&a);
for(i=0;i<a+1;i++)
gets(crr[i]);
for(i=0;i<a+1;i++)
{
l=strlen(crr[i]);
for(j=0;j<l;j++)
{
if(crr[i][j]>='0'&&crr[i][j]<='9')
{
if(crr[i][j+1]>='0'&&crr[i][j+1]<='9')
{
str[n++]=(crr[i][j]-'0')*10+(crr[i][j+1]-'0');j++;
I=n-1;
}
else
{str[n++]=(crr[i][j]-'0');I=n-1;}
}
if(crr[i][j]=='-')
for(k=j;k<l;k++)
if(crr[i][k]>='0'&&crr[i][k]<='9')
{
if(crr[i][k+1]>='0'&&crr[i][k+1]<='9')
for(x=str[I];x<=(crr[i][k]-'0')*10+(crr[i][k+1]-'0');x++)
str[n++]=x;
else
for(x=str[I];x<=(crr[i][k]-'0');x++)
str[n++]=x;
break;
}
}
mma(str,n);
for(b=0;b<n;b++)
if(str[b]!=101)//不输出无效数据
{ if(b!=0)
printf(",");
printf("%d",str[b]);
}e++;
for(b=0;b<n;b++)
str[b]=101;
if(e>1)
printf("\n");
}
return 0;
}
void fun(int s[ ] , int num)//冒泡排序
{
int i, j;
for (i = 0; i < num; i++)
{
for (j = i; j < num; j++)
{
if (s[i] > s[j])
{
int tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
}
}
void mma(int crr[],int l)//删除重复数字
{
int i,j,n=0,x=0;
int brr[1000];
for(i=0;i<l;i++)
{
int flag=0;
for(j=i+1;j<l;j++)
{
if(crr[i]==crr[j])
flag++;
}
if(flag==0)
{
brr[x]=crr[i];
x++;
n++;}
}
fun(brr,n);
for(i=0;i<n;i++)
crr[i]=brr[i];
for(i=n;i<l;i++)
crr[i]=101; //数组后面不需要的数定义为无效数据
}