1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
#include<iostream> #include<string.h> #include<cstdio> #include <sstream> using
namespace std;
template
< class
T>
class
joseph
{ struct
node
{
T data;
node * next;
node():next(NULL) {}
node(T d):data(d),next(NULL) {}
};
private :
node * head;
node * cur;
node * pre;
public :
joseph(T d);
int
len = 0;
void
setValue(T d)
{
node * tem = new
node(d);
cur ->next = tem;
tem -> next = head;
cur = cur -> next;
pre = pre -> next;
len++;
}
void
out()
{
pre -> next = cur -> next;
cout<<cur -> data<< " " ;
delete
cur;
cur = pre -> next;
len--;
}
void
nextmove()
{
cur = cur -> next;
pre = pre -> next;
}
void
init()
{
cur = cur -> next;
pre = pre -> next;
}
}; //模板函数:将string类型变量转换为常用的数值类型(此方法具有普遍适用性) template
< class
Type>
Type stringToNum( const
string& str)
{ istringstream iss(str);
Type num;
iss >> num;
return
num;
} template
< class
T>
joseph<T> :: joseph(T d) { head = new
node(d);
node * fz = new
node();
cur = head;
pre = fz;
pre -> next = head;
} int
main()
{ string z,x;
cout<< "please input n" <<endl;
cout<< "please input m" <<endl;
while (cin>>z>>x)
{
int
a = 1 ; //为第一个节点赋值而创建的
int
j = 0 ; //j为n的输入判断因子,当j=1时说明输入的n不是int型
int
k = 0 ; //k为m的输入判断因子,当j=1时说明输入的n不是int型
joseph< int > dusk(a); //创建第一个节点,并调用构造函数把第一个节点赋值为1
dusk.len++; //链表长度加一
int
n , m ; //n为人数,m为密码
int
flag = 0; //是否继续
for ( int
i = 0 ; i < z.length() ; i++) //判断n是不是int型
{
if (z[i]< ‘0‘ ||z[i]> ‘9‘ )
{
cout<< "n input error" <<endl;
j = 1;
flag = 1;
break ;
}
}
n = stringToNum< int >(z); //调用函数把string型的n转换成int型
for ( int
i = 0 ; i < x.length() ; i++) //判断m是不是int型
{
if (x[i]< ‘0‘ ||x[i]> ‘9‘ )
{
cout<< "m input error" <<endl;
k=1;
flag = 1;
break ;
}
}
if (flag)
{
cout<< "please input n" <<endl;
cout<< "please input m" <<endl;
continue ;
}
m = stringToNum< int >(x); //调用函数把string型的m转换成int型
if (n == 1)
{
cout << 1 << endl;
cout<< "please input n" <<endl;
cout<< "please input m" <<endl;
continue ;
}
if (k==1||j==1) break ; //判断因子有一个等于1说明:n,m有一个输入的不是int型,结束循环
for ( int
i = 2 ; i <= n ; i++) //初始化赋值
{
dusk.setValue(i);
}
dusk.init(); //把cur指针指向head,把pre的next指向cur
while (dusk.len!=0) //长度不为0时循环
{
for ( int
i = 1 ; i < m ; i++) //移动
{
dusk.nextmove();
}
dusk.out();
}
cout<<endl;
cout<< "please input n" <<endl;
cout<< "please input m" <<endl;
}
} |