第1个回答 2015-11-05
#include <stdio.h>
#define ARRAYLENGTH 100 //队伍长度
#define NUMBER 3 //计数周期,即1、2、3
#define OUTHERE -1 //标记队员退出队列
#define SUCCESSNUMBER 2 //最终剩余人数
/* 初始化队员编号,编号从1开始 */
void init_int_array(int * arr, int length);
/* 打印当前队员情况,-1为标记退出 */
void show_int_array(int * arr, int length);
/* 判断当前队员是否是min个 */
int is_end_array(int * arr, int length, int min);
/* 数数并标记退出队员 */
void calc_mark(int * arr, int length, int number);
/* 打印剩下队员的初始编号 */
void show_default_number(int * arr, int length);
int main(void)
{
int arr[ARRAYLENGTH];
init_int_array(arr, ARRAYLENGTH);//初始化数组,即队伍编号
show_int_array(arr, ARRAYLENGTH);//打印数组,即队伍情况
while (!is_end_array(arr, ARRAYLENGTH, SUCCESSNUMBER)) {
calc_mark(arr, ARRAYLENGTH, NUMBER);//标记退出的队员
show_int_array(arr, ARRAYLENGTH);//打印数组,即队伍情况
}
printf("The Result Is:\n");
show_int_array(arr, ARRAYLENGTH);//最终报数完成后队伍情况
show_default_number(arr, ARRAYLENGTH);//打印剩余队员的原始编号
return 0;
}
void init_int_array(int * arr, int length)
{
for (int i = 1; i <= length; i++) {
*(arr + i - 1) = i;//给第i-1个队员编号
}
}
void show_int_array(int * arr, int length) {
for (int i = 0; i < length; i++) {
printf("%3d, ", *(arr+i));//输出每个队员的编号,编号占3个字符宽度,如100输出为"100, ",2输出为" 2, "
if ((i + 1) % 10 == 0) {//输出10个即换行
printf("\n");
}
}
}
int is_end_array(int * arr, int length, int min) {
int size = 0;//未退出队员计数器
for (int i = 0; i < length; i++) {
if (*(arr+i) != OUTHERE) {//判断未退出队员则计数器加1
size++;
}
}
size = (size == min) ? 1 : 0;//剩余队员为min个则返回1,反之返回0
return size;
}
void calc_mark(int * arr, int length, int step) {
int count = 0;
for (int i = 0; i < length; i++) {
if (*(arr + i) != OUTHERE) {//还未退出的队员
count++;//队员未退出,计数器加1
}
if (count % step == 0) {
*(arr + i) = OUTHERE;//数到3的则标记为退出
}
}
}
void show_default_number(int * arr, int length)
{
printf("剩余队员的初始编号为:\n");
for (int i = 0; i < length; i++) {
if (*(arr + i) != OUTHERE) {
printf("%d\n", (i+1));
}
}
}