华为机考--约瑟夫问题

问题描述:    
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序比如:
输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。

采用循环链表的方式实现:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct NODE{
 5     int num;
 6     NODE *next;
 7 };
 8 
 9 
10 int main()
11 {
12     char s[50];
13     int m;
14     NODE *pNew=NULL,*pHead=NULL,*pRear=NULL,*pTemp=NULL;;
15     int i;
16     while(cin>>s>>m)
17     {
18         for (i=0;s[i];i++)
19         {
20             pNew=new NODE;
21             pNew->num=s[i]-'0';
22             if (i==0)
23             {
24                 pHead=pRear=pNew;
25             } 
26             else
27             {
28                 pRear->next=pNew;
29             }
30             pNew->next=NULL;
31             pRear=pNew;
32         }
33         pRear->next=pHead;
34         for (i=0;i<s[i];i++)
35         {
36             pTemp=pHead;
37             for (int i=1;i<m;i++)
38             {
39                 pTemp=pHead;
40                 pHead=pHead->next;
41             }
42             pTemp->next=pHead->next;
43             m=pHead->num;
44             pHead=pTemp->next;
45             cout<<m;
46         }
47         cout<<endl;
48     }
49     return 0;
50 }

运行结果:

原文地址:https://www.cnblogs.com/LiuYujie/p/3964744.html