您的位置:首页 > 其它

约瑟夫环问题变形——循环数到的数中,若某一位是给定数D,则踢出此人。

2012-06-18 17:51 288 查看
这是湘大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 <stdio.h>

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐