这是湘大2012年6月18日程序设计实践考试的一个题目。
——————————————————————
题目描述:
Cycle
Description
题目描述
N个人按顺时钟围成一个圈,标号为1到N,然后从1号人从1开始按顺时钟数数。如果数到数字中含有数码D,那么这个人就退出圈子,下个人继续数下一个数,直到剩下一个人为止。
输入
第一行是一个整数K,表示样例的个数。
每个样例占一行,为两个整数N (1 ≤ N ≤ 1000), D (0 ≤ D ≤ 9);
输出
每行输出一个样例的结果,即最后剩下的那个人的标号。
样例输入
3
5 0
5 1
5 2
样例输出
4
5
5
Sample Input
Sample Output
——————————————————————————————————————————
很可惜,当时没做出来。
下午敲了下,觉得应该是这样的,也不知道如果提交上去,会不会ac。
代码:
————————————————————————————————————————
#include <malloc.h>
struct data
{
int v;
struct data *next;
}; //定义一个结构体,存储“人”的编号,和下个“人”的地址。
int f(int m, int a)
{
while (m)
{
if (m % 10 == a)
return 1;
m = (m - m % 10) /10;
}
return 0;
}
//判断当数到某数字m时,数字m的各个数位中,是否有数字a(0=<a<=9)。
int main()
{
int t, n, d;
int j, x;
struct data * head ,*p, *q;
scanf("%d", &t);
head = (struct data*)malloc(sizeof (struct data));
head->v = -99999;
while(t--)
{
p = q = head;
scanf("%d%d", &n, &d);
{
for (j = 0; j < n; j++)
{
q = (struct data*)malloc(sizeof (struct data));
q->v = j + 1;
p ->next = q;
p = q;
}
q->next = head->next;
}
//初始数数字的环。
q = head ->next;
j = 1;
x = 1;
while (j < n)
{
if (f(x, d))
{
p ->next = q->next;
free(q);
q = p;
j++;
}
else
{
p = q;
}
q = q->next;
x++;
}
//数数过程。
printf("%d\n\n",p->v );
}
return 0;
}