Problem Description
说到“敢死队”,大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下:
有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。
这题本来就叫“敢死队”。“谁都不想去”,就这一句我觉得这个问题也只能叫“不敢死队问题”。今天大家就要完成这道不敢死队问题。我们假设排长是1号,按照上面介绍,从一号开始数,数到5的那名战士去执行任务,那么排长是第几个去执行任务的?
Input
输入包括多试数据,每行一个整数M(0<=M<=10000)(敢死队人数),若M==0,输入结束,不做处理。
Output
输出一个整数n,代表排长是第n个去执行任务。
Example Input
9
6
223
0
Example Output
2
6
132
01 | #include<stdio.h> |
02 | #include<stdlib.h> |
03 | struct node |
04 | { |
05 | int date; |
06 | struct node *next; |
07 | } *head, *tail, *p, *q; |
08 | int main() |
09 | { |
10 | int m, i, n, d, f; |
11 | while ( scanf ( "%d" , &m) && m != 0) |
12 | { |
13 | n = 0; |
14 | d = 0; |
15 | f = 1; |
16 | p = ( struct node *) malloc ( sizeof ( struct node)); |
17 | p -> date = 1; |
18 | p -> next = NULL; |
19 | head = p; |
20 | tail = p; |
21 | for (i = 2; i <= m; i++) |
22 | { |
23 | p = ( struct node *) malloc ( sizeof ( struct node)); |
24 | p -> date = i; |
25 | tail -> next = p; |
26 | tail = p; |
27 | p -> next = NULL; |
28 | } |
29 | tail -> next = head; |
30 | p = head; |
31 | while (p -> next != head) |
32 | { |
33 | p = p -> next; |
34 | } |
35 |
36 | while (f) |
37 | { |
38 | q = p -> next; |
39 | d++; |
40 | if (d % 5 == 0) |
41 | { |
42 |
43 | n++; |
44 | p -> next = q -> next; |
45 | if (q -> date == 1) |
46 | { |
47 | f = 0; |
48 | break ; |
49 | } |
50 | free (q); |
51 |
52 | } |
53 | else |
54 | { |
55 | p = q; |
56 | } |
57 | } |
58 | printf ( "%d\n" , n); |
59 | } |
60 | return 0; |
61 | } |
62 |