Num 4: HDOJ: 题目1106 : 排序(以5为分隔符进行分割)



原题链接


因为一直学的都是坑爹的C,学长给了一个C++的代码(感谢学长 T T),

作为小白的我头文件都还看不懂  ≥~~≤ ,这里就先普及了一下C++与C语言头文件的一些常识(摘录) [感谢度娘]:


以学长给的头文件为例:

#include <cstdio> // stdio.h
#include <iostream> //input output stream
#include <cstring> //string.h
#include <algorithm> //该头文件包含了一些算法
using namespace std; //用#include<iostream.h>就不需写这句话(旧标准)。但是如果你用
// #include<iostream>就必须要写
// 使用std这个名字空间


#include 是个包含命令,就是把iostream.h这个文件里的内容复制到这个地方
ostream.h是input output stream的简写,意思为标准的输入输出流头文件。它包含:
(1)cin>>"要输入的内容"
(2)cout<<"要输出的内容"
这两个输入输出的方法需要#include<iostream.h>来声明头文件。
iostream.h与iostream是不同的。
#include<iostream.h>是在旧的标准C++中使用。在新标准中,用#include<iostream>。
iostream 的意思是输入输出流。
#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件。


  using namespace std;
  是:后缀为.h的头文件C++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,
  声明在带.h后缀的头文件里,C++标准为了和C区别开,
  也为了正确使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,
  相当于在c中调用库函数,使用的是全局命名空间,
  也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;
  这样才能正确使用cout。


下面我粘一下题目:

排序

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 41661    Accepted Submission(s): 11936


Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

 

Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
 

Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
 

Sample Input
  
  
0051231232050775
 

Sample Output
  
  
0 77 12312320
 

学长的AC代码:

#include <cstdio>		
#include <iostream>		
#include <cstring>	
#include <algorithm>
using namespace std;	
char str[1100];
int a[1100];
int main ()
{
	while(scanf("%s", &str)!=EOF)
	{
		int len = strlen(str);
		int k = 0, i;
		memset(a, 0 , sizeof(a));		
		//	memset(void *s,int c,size_t n) 将已开辟内存空间 s 的首 n 个字节的值设为值 c;
		//	一字节一字节地把整个数组设置为一个指定的值,用于初始化;
		
		for(i=0; i< len; i++)				
		{
			if(str[i] != '5')				//搜索开头的‘5’就向后(就跳过,不读入)
				break;
		}
		
		for(; i < len; ++i)					
		{
			if(str[i] != '5')
			{
				for(; i<len && str[i] != '5'; ++i)<span style="white-space:pre">	</span>//<span style="white-space:pre">	</span>不是5且未结束
				{
					a[k] = a[k] * 10 + str[i] - '0';//<span style="white-space:pre">	</span>分离出5后面的数字;!!!
			}
				k++;					//	利用k记录数据的个数……
			}
		}
		
		sort(a, a + k);
		//	sort(begin,end),表示一个范围,把数组a按升序排序;
		//	用#include <algorithm> sort即可使用</span>
		
		for(int j = 0; j < k - 1; ++j)		//	输出除最后一个元素以外的其他元素
			
		printf("%d\n", a[k - 1]);		//	最后一个元素结束输出空格 
	}
	
	return 0;
}									

小结:

其中的算法:
1. sort (直接进行排序);

2. a[k] = a[k] * 10 + str[i] - '0'; 将字符转化为数字并存储;

3. for(int j = 0; j < k - 1; ++j)
printf("%d ", a[j]);

printf("%d\n", a[k - 1]);
保证输出格式的正确;

后来根据算法的思想,自己编的C的代码(已AC):
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	char str[1001];
	int end[1001];
	while(scanf("%s",&str)!=EOF)
	{
		int len,n=0,i,p,q,j,temp;
		len=strlen(str);
		for(i=0;	i<len;	i++)
		{
			if(str[i]!='5') break;
		}
		for(;	i<len;	i++)
		{
			if(str[i]!='5')
			{
				for(end[n]=0;	str[i]!='5'&&i<len;	i++)
				{
					end[n]=end[n]*10+str[i]-'0';
				}
				n++;
			}
		}
	for(p=0;	p<n;	p++)<span style="white-space:pre">			//冒泡排序
	{
		for(q=0;	q<n-p-1;	q++)
		{
			if(end[q]>end[q+1])
			{
				temp=end[q];
				end[q]=end[q+1];
				end[q+1]=temp;
			}
		}
	}
	for(j = 0; j < n - 1; ++j)		
			printf("%d ", end[j]);
			
		printf("%d\n", end[n - 1]);	
	}
	
	return 0;
}


发现自己还是实力不够哎~
这么简单的题~~  :  (  ....





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值