Description
有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。
Input
第一行输入小孩的人数N(N<=64)
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔
Output
按人名输出小孩按顺序出列的顺序,每行输出一个人名
Sample Input
5 Xiaoming Xiaohua Xiaowang Zhangsan Lisi 2,3
Sample Output
Zhangsan Xiaohua Xiaoming Xiaowang Lisi 普通版: #include<iostream> #include<cstring> using namespace std; int main() { char name[56][16]; int n, w, s; cin >> n; for (int i = 1; i <= n; i++) { cin >> name[i]; } scanf("%d,%d", &w, &s); int count = 0; //记录经过未标记的名字几次 int k = 0; //记录输出的次数 for (int i = w; k!=n ; i++) { //输出 n 次,跳出 if (i > n) i = i % n; //循环 1~n~1~n if (strcmp(name[i], "1")) count++; //经过未标记的名字时 count++ if (count == s) { //经过s次未被标记的名字时 cout << name[i] << endl; k++; //输出一次 k++ count = 0; //输出以后count重新记数 w = i; //输出之后,w 重新从 i 开始 strcpy(name[i], "1"); //已经输出的名字标记为 1 } } return 0; } 线性表: #include<iostream> #include<string> using namespace std; class SeqList { public: SeqList(string str[], int n); //构造函数,创建长度为n 的线性表 string Delete(int i); //输出并删除结点 int getLength() { return length; } //获取长度 private: int length; string name[65]; }; SeqList::SeqList(string str[], int n) { //实现构造函数 for (int i = 0; i < n; i++) { name[i] = str[i]; } length = n; } string SeqList::Delete(int i) { string x = name[i - 1]; //定义一个x接收被删除的字符串 for (int j = i; j < length; j++) { //从被删除的结点开始,后面的向前移动,覆盖被删除的结点 name[j - 1] = name[j]; } length--; //删除一个结点,长度减 1 return x; } int main() { string str[65]; int n, w, s; cin >> n; for (int i = 0; i < n; i++) { cin >> str[i]; } scanf("%d,%d", &w, &s); SeqList S(str, n); while(n--) { int ans = (w + s - 1); //ans 表示要输出的名字的序号 if ( ans==S.getLength() ) { w = ans; cout << S.Delete(w) << endl; } else { if (ans % S.getLength() != 0) { w = ans % S.getLength(); cout << S.Delete(w) << endl; } else { cout << S.Delete(w--) << endl; } } } return 0; }