前几篇都是运用了循环单链表的知识解决该问题(http://blog.itpub.net/29876893/viewspace-1815055/,http://blog.itpub.net/29876893/viewspace-1850077/,http://blog.itpub.net/29876893/viewspace-1851818/),下面用循环数组来解决该问题。运用的解题思路和第三篇类似,给元素设置标识,退出循环的条件就是被标识的元素总数=学生总数。下面给出代码:
-
#include<iostream>
-
#define MAX_SIZE 10
-
using namespace std;
-
int j,flag,q,sizeA;
-
char lastone;
-
void searchnote(char *,int);
-
void searchnote(char *A, int n) {
-
cout << "出队的顺序依次是:" << endl;
-
for (int i = 0;i<=sizeA;i++){ //扫描数组
-
-
if (i == sizeA) { //如果循环整个数组后,则取余,构成循环数组
-
i%=sizeA;
-
}
-
if(A[i] == NULL) {
-
continue;
-
}
-
q++;
-
if (q == n) { //若q等于间隔数n,则此时A[i]就是被标识的元素,且q置为0
-
cout << A[i]<< " ";
-
flag++;
-
if (flag == sizeA) { //该步骤是为了打印最后一个同学编号,否则最后一个同学别标识为NULL
-
lastone = A[i];
-
}
-
A[i] = NULL;
-
q = 0;
-
}
-
if (flag == sizeA) { //循环退出条件
-
cout << endl;
-
cout << "获胜的同学是:" << endl;
-
cout << lastone;
-
break;
-
}
-
}
-
}
-
-
int main() {
-
-
cout << "请输入同学的编号:" << endl;
-
char note[MAX_SIZE];
-
for (char ch; cin >>ch, j++) { //构建数组
-
note[j] = ch;
-
cout << note[j] << " ";
-
sizeA++;
-
}
-
cout << endl;
-
searchnote(note, 4);
-
cout << endl;
-
}
运行结果:
上面给出的只是解题思路,希望有抛砖引玉的作用,相信读者还有更好的算法。当然该程序有更多的功能可以完善,其中涉及到一些细节给出了简单的注释。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29876893/viewspace-1853008/
,如需转载,请注明出处,否则将追究法律责任。