首页 > 代码库 > 约瑟夫环 c++ 循环输入

约瑟夫环 c++ 循环输入

?
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;
    }
 
}