您的位置:首页 > 其它

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

2015-07-22 09:33 337 查看
原题链接

因为一直学的都是坑爹的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
=0;	str[i]!='5'&&i<len;	i++)
{
end
=end
*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;
}


发现自己还是实力不够哎~
这么简单的题~~ : ( ....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: