Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 1896 | Accepted: 972 |
Description
Input
Output
Sample Input
0. banana, strawberry, OrAnGe. Banana, StRaWbErRy, orange. 10, 8, 6, 4, 2, 0. x, 30, -20, z, 1000, 1, Y. 50, 7, kitten, puppy, 2, orangutan, 52, -100, bird, worm, 7, beetle. .
Sample Output
0. banana, OrAnGe, strawberry. Banana, orange, StRaWbErRy. 0, 2, 4, 6, 8, 10. x, -20, 1, Y, 30, 1000, z. -100, 2, beetle, bird, 7, kitten, 7, 50, orangutan, puppy, 52, worm.
// poj1028.cpp : 定义控制台应用程序的入口点。 // #include <stdio.h> #include <iostream> #include <string> using namespace std; int flag[100];//标志原串中是数字还是单词 string word[30];//输入存储数组 int dig[30];//保存数字 string cha[30];//保存单词 char str[100];//输入存储数组 int i,j,k,len,clen,dlen;// int input() { i=0; cin>>str;//输入字符串 if(str[0]=='.')//若是一个“.”,结束 return 1; while(str[strlen(str)-1]!='.')//考虑进行改进 { str[strlen(str)-1]= '/0'; word[i]=str; if(isalpha(str[0]))//判断是否是字母 flag[i]=1; else flag[i]=0; i++; cin>>str; } str[strlen(str)-1]='/0'; word[i]=str; if(isalpha(str[0])) flag[i]=1; else flag[i]=0; len=i+1;//记录输入的数字和单词的总个数 return 0; } int atoi(string s,int i)//将ASCII码数字转换成int型 { int n=0; for(;i<s.length()&&s[i]>='0'&&s[i]<='9';++i) n=10*n+(s[i]-'0'); return n; } void partition()//将数字和单词分开保存的函数 { j=0,k=0,clen=0,dlen=0; for(i=0;i<len;i++) { if(flag[i]==1)//字母 { cha[j]=word[i]; j++; clen++;//记录有多少个单词 } else { if(word[i][0]!='-') dig[k]=atoi(word[i],0); else { dig[k]=(-1)*atoi(word[i],1); } k++;dlen++;//记录有多少个数字 } } } int cmp2(string a,string b)//用于单词的比较 { char c[30];//用于临时保存被小写化得单词(题目中要求不区分大小写) char d[30]; for(int i=0;i<a.length();i++) { c[i]=isupper(a[i]) ? a[i]-'A' +'a':a[i]; } for(int i=0;i<b.length();i++) { d[i]=isupper(b[i]) ? b[i]-'A' +'a':b[i]; } if(strcmp(c,d)<=0) return 1; else return 0; } int part1(string a[],int p,int r)//单词数组的quick_sort中的partition()函数 { string x=a[r]; int i=p-1; string temp; for(int j=p;j<=r-1;j++) { if(cmp2(a[j],x)) { i++; temp=a[j]; a[j]=a[i]; a[i]=temp; } } temp=a[r]; a[r]=a[i+1]; a[i+1]=temp; return i+1; } int part2(int a[],int p,int r)//数字数组的quick_sort中的partition()函数 { int x=a[r]; int i=p-1; int temp; for(int j=p;j<=r-1;j++) { if(a[j]<=x) { i++; temp=a[j]; a[j]=a[i]; a[i]=temp; } } temp=a[r]; a[r]=a[i+1]; a[i+1]=temp; return i+1; } void quicksort2(int a[],int p,int r) { if(p<r) { int q=part2(a,p,r); quicksort2(a,p,q-1); quicksort2(a,q+1,r); } } void quicksort1(string a[],int p,int r) { if(p<r) { int q=part1(a,p,r); quicksort1(a,p,q-1); quicksort1(a,q+1,r); } } void output() { for(int i=0,j=0,k=0;i<len;i++) { if(i!=len-1) { if(flag[i]==1)//字符串 { cout<<cha[j]<<", "; j++; } else { cout<<dig[k]<<", "; k++; } } else { if(flag[i]==1)//字符串 { cout<<cha[j]<<'.'; j++; } else { cout<<dig[k]<<'.'; k++; } } } cout<<'/n'; } int main(void) { while(1) { if(input()) break; partition();//将单词和数字分开 quicksort1(cha,0,clen-1); quicksort2(dig,0,dlen-1); output(); } return 0; }