题目:
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
输入值
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
输出量
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
样本输入
0051231232050775
样本输出
0 77 12312320
错误代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
typedef struct
{
char str[1010];
int shu;
}STD;
STD s[1020];
int main()
{
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
char a[1020];
int i,j,k,n,e,g,q,m,x,z,y=0;
z=0;
while(scanf("%s",a)!=EOF)//此处用~scanf()和EOF相反;
{
j=0;
i=0;
// if(z==1&&y==1)
// printf("\n");
// if(z==1)
// y=1;
while(a[i]!='\0')
{
q=1023;
while(q--)//这里是关键 每次重新输入数据时 需要重置一下;不然会计算到上次数据 出错!
{
s[j].str[q]='\0';
s[q].shu=0;
}
k=0;
g=0;
while(a[i]!='5')
{
//printf("%s\n",s[j].str[k]);
s[j].str[k]=a[i];
i++;
k++;
g=1;
//printf(" %s\n",s[j].str);
}
if(a[i]=='5')
i++;
if(g!=0)
j++;
//printf(" %d\n",i);
}
for(i=0;i<j;i++)
{
s[i].shu=0;
n=strlen(s[i].str);
//printf("这里的n的值%d\n",n);
k=0;
while(n--)
{
m=n;
x=1;
s[i].shu=s[i].shu*10 + (s[i].str[k]-'0');
k++;
}
}
// printf("\n%d %d %d\n",s[0].shu,s[1].shu,s[2].shu);
// sort(s.&shu,(s+j).&shu);
for(i=0;i<j;i++)//这里可以用sort()调用函数,但不能会用结构体;
for(k=0;k<i;k++)
{
if(s[i].shu<s[k].shu)
{
e=s[i].shu;
s[i].shu=s[k].shu;
s[k].shu=e;
}
}
//printf("%d\n",j);
for(i=0;i<j;i++)
{
printf("%d",s[i].shu);
if(i!=(j-1))
printf(" ");
}
/**/
// if(z==0)
printf("\n");
// z=1;
i=1023;
while(i--)
{
a[i]='\0';
}
}
// fclose(stdin);
// fclose(stdout);
}
这个代码本来各种错,先是运行错误,再是答案错误 运行错误是是因为字符数组越界,导致运行错误后来吧代码输入端a 储存端str都扩展到1020 问题依然出现,然后是我就猜测是可能int数组,数字越界,然后我测试了几组数据的输出出现上组数据存储的数据,发现是初始化的问题,我又对数据进行初始化,这里结构体的初始化是真的麻烦!我采用循环初始化,对结构体里的每个字符数组初始化,问题相当的麻烦,解决了之后又出现了,答案错误!我测试了好几例都没发现错误答案;后来干脆放弃了这种计算方法,我采用了下面这种代码!
#include<stdio.h>
#include<string.h>
int main()
{
char str1[1010];
int shu[1010];
int i,j,n,num,k,e;
while(scanf("%s",str1)!=EOF)
{
j=0;
n=strlen(str1);
num=0;
for(i=0;i<n&&str1[i]!='\0';i++)
{
if(str1[i]=='5'&&str1[i]!='\0')
continue;
while(str1[i]!='5'&&str1[i]!='\0')
{
num=num*10+str1[i]-'0';
i++;
}
shu[j++]=num;
if(str1[i]=='5'||str1[i]=='\0')
num=0;
}
//sort(shu,shu+j);//放地址
for(i=0;i<j;i++)
for(k=0;k<i;k++)
{
if(shu[i]<shu[k])
{
e=shu[i];
shu[i]=shu[k];
shu[k]=e;
}
}//printf("%d\n\n",j);
for(i=0;i<j;i++)
{
printf("%d",shu[i]);
if(i!=j-1)
printf(" ");
}
printf("\n");
}
}
这种好在简单没用到结构体,这种的都不用初始化,将输入的字符串,一个一个个‘5’&‘\0比较,然后就是处理一下5开头5结尾等问题,再找个数组存储计算出来的数据,然后冒泡排序。输出!
这个题我学到了
1.~scanf()提交时不能被编译,实际意义是有输入是返回1和scanf()!=EOF相反
2.做题时一定不要急着写代码先把大致流程写出来,思考注意点,是否可以用int,有没有简单点的思路,写最少的最好理解的代码!
3.像这种从左往右从字符串中穿换成数字可以采用这种非常好用:num=num*10+str1[i]-‘0’;