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
Sample Output
学长的AC代码:
小结:
其中的算法:
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):
发现自己还是实力不够哎~
这么简单的题~~ : ( ....
因为一直学的都是坑爹的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; }
发现自己还是实力不够哎~
这么简单的题~~ : ( ....
相关文章推荐
- 理解delete和free
- hdu 5291 Candy Distribution 2015 Multi-University Training Contest 1
- [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)
- linux下vi编辑器回格不能删除内容,并且使用方向键也会有问题
- Android Studio使用技巧系列教程(六)
- About enterprisedb密码
- 内部类和匿名内部类
- MySqlBackup.NET - MySQL Backup Solution for C#, VB.NET, ASP.NET
- Linux中软链接与硬链接
- android 基本控件
- hdu5289-multi-university contest 1 -1002
- 网址
- 数据结构——二叉树的遍历
- Visual Studio Professional 2015 (x86 and x64) - DVD (Chinese-Simplified)
- VS2015企业版,社区版,专业版详细对比
- redis数据丢失及解决
- 轻松使用SaltStack管理成千上万台服务器(入门教程)
- 黑马66期android学习笔记17_短信发送器
- poj 2421 Constructing Roads(kruskal)(基础)
- 程序的编译、链接与装载