问题描述
有
n个小朋友围成一圈玩游戏,小朋友从1至
n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在
n号小朋友的顺时针方向。
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为 k的倍数或其末位数(即数的个位)为 k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当n=5, k=2时:
1号小朋友报数1;
2号小朋友报数2淘汰;
3号小朋友报数3;
4号小朋友报数4淘汰;
5号小朋友报数5;
1号小朋友报数6淘汰;
3号小朋友报数7;
5号小朋友报数8淘汰;
3号小朋友获胜。
给定 n和 k,请问最后获胜的小朋友编号为多少?
游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为 k的倍数或其末位数(即数的个位)为 k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当n=5, k=2时:
1号小朋友报数1;
2号小朋友报数2淘汰;
3号小朋友报数3;
4号小朋友报数4淘汰;
5号小朋友报数5;
1号小朋友报数6淘汰;
3号小朋友报数7;
5号小朋友报数8淘汰;
3号小朋友获胜。
给定 n和 k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数
n和
k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。
#include <stdio.h>
#include <malloc.h>
#define MaxDataNum 1001
struct QueueStruct {
int size;
int rear, front;
int array[MaxDataNum];
};
typedef struct QueueStruct* queue;
void push( queue q, int u );
int pop( queue q );
int top( queue q );
int main( void ) {
queue q = ( queue )malloc( sizeof(struct QueueStruct) );
int i = 0, num = 0, k = 0, digit = 0;
scanf("%d %d", &num, &k);
q->size = 0;
q->front = q->rear = 0;
for( i = 1; i <= num; i++ ) {
push( q, i );
}
num = 1;
while( q->size > 1 ) {
digit = pop( q );
if( (num%k != 0) && (num%10 != k) ) {
push( q, digit );
}
num++;
}
printf("%d", pop( q ));
return 0;
}
void push( queue q, int u ) {
q->size++;
q->rear = (q->rear+1) % MaxDataNum;
q->array[q->rear] = u;
}
int pop( queue q ) {
q->front = (q->front+1) % MaxDataNum;
q->size--;
return q->array[q->front];
}
int top( queue q ) {
return q->array[(q->front+1) % MaxDataNum];
}
我全都是用c写的,没有c++方便,下个学期转c++吧。