卡我?呵呵!

题目:

输入一行数字,如果我们把这行数字中的‘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’;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值