HDU——1106排序(istringstream的使用、STLvector练习)
排序
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 46057 Accepted Submission(s): 13221
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
今天HDU11页上找找还有没有适合我这种菜鸟的水题时看别人的题解突然看到了这题。让我想起来做过的HDU——2072统计单词数。心里感觉这个东西可以进行输入重定向,但是就是百度了半天没百度到。还是去找了2072的代码(好吧2072也不完全是自己写的)。发现了这个玩意儿 istringstream(加上空格方便记忆,i string stream)
有了它这题写法比百度上的题解简单多了。偷个小懒嘿嘿
代码:
#include<iostream> #include<string> #include<sstream> #include<algorithm> using namespace std; int power(int n,int cishu)//主要坑点还有这个,pow函数有误差,不如自己写一个 { int sum=1; for (int i=1; i<=cishu; i++) { sum=sum*n; } return sum; } int sto(const string a)//string to int转换函数。 { int i,sum=0; int len=a.size(); for (i=len-1; i>=0; i--)//有个好处可以不管开头的0,从后往前的话前导0乘以权重还是0 { sum+=(a[i]-'0')*power(10,len-1-i); } return sum; } int main(void) { string str,k; while(getline(cin,str)) { for(int i=0; i<str.size(); i++) if(str[i]=='5') str[i]=' ';//将题目中要求的5替换为空格 istringstream sin(str);//进行输入重定向,格式为istringstream 重新定义的输入函数名称(源头字符串) int num[1000]={},t=0,i; while(sin>>k)//从str中向临时变量k输入,用这个好处就是可以直接忽略掉中间的空格跟,不管几个 { num[t]=sto(k); t++;//记录个数 } sort(num,num+t); for(i=0; i<t; i++) { if(i!=t-1) cout<<num[i]<<' '; else cout<<num[i]<<endl; } } return 0; }
刚学了vector和STL一些函数,加上之前又去再次了解了下istringstream,发现重定向后可以直接进行数字或者其他的输入,不一定要是string。因此修改了下上面的代码并且用vector和对容器的sort,以及迭代器。
代码:
#include<iostream> #include<sstream> #include<algorithm> #include<vector> using namespace std; int main(void) { string str; while(getline(cin,str)) { for (int i=0; i<str.size(); i++) { if(str[i]=='5') str[i]=' '; } int t; vector<int>list; istringstream sin(str); while(sin>>t) { list.push_back(t); } sort(list.begin(),list.end()); for (vector<int>::iterator it=list.begin(); it!=list.end(); it++) { if(it!=list.end()-1) cout<<*it<<' '; else cout<<*it<<endl; } } return 0; }