这个程序我在自己的电脑上运行正常,但是在PKU的网站上提交后结果就是编译错误。
估计是那个编译器的版本太老了吧。
我对这个代码的满意率为70%-80%,有些地方还是处理得不太好,但是正常工作。
干掉了几个非常要命的bug,现在可以正常工作了。
北大ACM的编译器版本貌似有点老了,我在DEV和CodeBlocks下编译运行都没问题。
能够正常完成样例输入输出,而且满足要求。
1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 class Tele 5 { 6 private: 7 string *number; 8 int *ArrayCount; 9 int presize; 10 void sort(); 11 void _delete(string &num,int position); 12 void movf(int position); 13 void convert(char & num); 14 public: 15 Tele(); 16 void Getsize(); 17 void GetNum(); 18 void deal(); 19 void show(); 20 ~Tele(); 21 }; 22 Tele::Tele() 23 { 24 number=NULL; 25 presize=0; 26 } 27 void Tele::Getsize() 28 { 29 cin>>presize; 30 number= new string [presize+1]; 31 if(number==NULL) 32 abort(); 33 number[presize]="\0"; 34 /*******************Part 2************************/ 35 ArrayCount = new int [presize];//used for count 36 if(ArrayCount==NULL) 37 abort(); 38 for(int i=0;i<presize;i++) 39 ArrayCount[i]=0; 40 } 41 void Tele::GetNum() 42 { 43 int psize=presize; 44 while(psize--) 45 cin>>number[psize]; 46 } 47 void Tele::deal() 48 { 49 for(int i=0;i<presize;i++) 50 for(int j=0;j<number[i].length();j++) 51 convert(number[i][j]); 52 /************************Part 2*************************/ 53 for(int i=0;i<presize;i++) 54 { 55 if(number[i][number[i].length()-1]=='-') 56 { 57 number[i][number[i].length()-1]='\0'; 58 number[i].resize(number[i].length()-1); 59 } 60 for(int j=0;j<number[i].length()-1;j++) 61 if(number[i][j]=='-') 62 { 63 _delete(number[i],j); 64 number[i].resize(number[i].length()-1); 65 j--; 66 } 67 } 68 sort(); 69 for(int i=0;i<presize;i++) 70 { 71 number[i].insert(3,"-"); 72 } 73 } 74 void Tele::sort() 75 { 76 int counter=presize; 77 for(int i=0;i<counter-1;i++) 78 for(int j=0;j<counter-i-1;j++) 79 if(number[j].compare(number[j+1])+1) 80 number[j].swap(number[j+1]); 81 /***********************Part 2***********************/ 82 for(int i=0;i<counter;i++)//kill the bug 83 { 84 if(counter>1) 85 while(!number[i].compare(number[i+1])&&i<counter)// 86 { 87 movf(i); 88 counter--; 89 ArrayCount[i]++; 90 } 91 } 92 presize=counter;//update the size 93 /***********************Part 3***********************/ 94 } 95 void Tele::show() 96 { 97 //cout<<"******************Start Line*****************\n"; 98 bool flag=0; 99 for(int i=0;i<presize;i++) 100 if(ArrayCount[i]!=0) 101 { 102 cout<<number[i]<<ends<<ArrayCount[i]+1<<endl; 103 flag=1; 104 } 105 else if(flag==0) 106 cout<<"No duplicates"; 107 //cout<<"******************End Line*****************\n"; 108 } 109 void Tele::movf(int position) 110 { 111 for(int i=position;i<presize;i++)//Right!!! 112 number[i]=number[i+1]; 113 } 114 void Tele::_delete(string &num,int position) 115 { 116 for(int i=position;i<num.length();i++) 117 num[i]=num[i+1]; 118 } 119 void Tele::convert(char & num) 120 { 121 char valtemp=num; 122 if(num>='A'&&num<='Z') 123 (num-='A')/=3; 124 else 125 return; 126 if(num>=0&&num<=4) 127 switch(num) 128 { 129 case 0:num='2';return; 130 case 1:num='3';return; 131 case 2:num='4';return; 132 case 3:num='5';return; 133 case 4:num='6';return; 134 } 135 num=valtemp; 136 if(num<='S'&&num!='Q') 137 num='7'; 138 else if(num<='V'&&num!='Q') 139 num='8'; 140 else if(num<'Z'&&num!='Q') 141 num='9'; 142 143 144 } 145 Tele::~Tele() 146 { 147 delete [] number; 148 delete [] ArrayCount; 149 } 150 151 152 int main() 153 { 154 //cout << "Hello world!" << endl; 155 156 157 Tele temp1; 158 temp1.Getsize(); 159 temp1.GetNum(); 160 temp1.deal(); 161 temp1.show(); 162 return 0; 163 }