• 约瑟夫环 c++ 循环输入


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

      

  • 相关阅读:
    iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
    一个基于MVVM的TableView组件化实现方案
    代码审查和不良编程习惯
    十二步创建你的第一个JavaScript库
    可简单避免的三个 JavaScript 发布错误
    巧用Javascript将相对路径地址转换为绝对路径
    jquery 事件对象属性小结
    26个Jquery使用小技巧
    应用于网站导航中的 12 个 jQuery 插件
    使用 jQuery 避免鼠标双击
  • 原文地址:https://www.cnblogs.com/Duskcl/p/3748009.html
Copyright © 2020-2023  润新知