C++ 字符串编程训练2

今天讲的一道习题是很经典的约瑟夫环问题,其实lz对于链表的某些操作还不是太懂,所以在程序中有些地方还不太看得懂,这里借鉴的网上的做法,还请大牛能够解答我的疑惑,谢谢!

标题:约瑟夫环

说明:约瑟夫环是这么一个问题:已知n个人(编号1,2,。。。n)围坐在圆桌周围。从编号为k的人开始报数,数到m的人出列,他的下一个人又从1开始报数,数到m的人出列,直到所有人都出列。

struct node{

int num;

node *next;

};

node *creat(int n)//构建一个链表,即head-》1-》2-》。。。-》n,最后n又回到head
{
    node *p,*q,*head=NULL;
    for(int i=0;i<=n;i++)
    {
     p=new node;
     p->num=i;
     if(head==NULL)
      {
        head=p; //head用0来表示
      }
     else
     {
        q->next=p;
     }
     q=p;
    }
    p->next=head;  //p变为最后一个节点
    return p;
}

int main()

{

int n,k,m;//n为总人数,k为开始报数的人的序号,m为报到的需要出列的数

cin>>n>>k>>m;

node *l,*q;

l=creat(n);//l即为生成的链表

q=l;l=l->next;

for(int i=1;i<k;i++)//这步其实不太理解是什么意思

{

q=l;

l=l->next;

}

while(l->next!=l)//l->next==l表示只剩下最后一个人了

{

for(int i=1;i<m;i++)//如果还没有报到则依次遍历

{

q=l;

l=l->next;

}

cout<<l->num<<"->";//输出出列的人的序号

q->next=l->next;//将这个人的位置删去

delete l;

l=q->next;//用出列的下一个人来代替出列的人

}

cout<<l->num;

delete l;

}

时间: 2024-12-12 11:00:32

C++ 字符串编程训练2的相关文章

C++ 字符串编程训练1

最近又到了找工作的时间,所以想每天抽点时间出来对编程进行相关训练.C++字符串是一个很重要的知识点,采用STL.算法等C++优于C的方面,能够使问题解决起来更加轻松.以下程序都是自己写的,可能有些地方时间效率.空间效率不高,所以希望大家能够多多讨论交流,互相提升. 题目:删除子串 说明:给定两个形参str和substr,其中str为源字符串,substr为需要删除的子串,如果str中包含substr,则将其删除并输出新的字符串,否则输出源字符串. void delete_substr(strin

C++ 字符串编程训练5

手机号码合法性: 1)长度13位 2)以86的国家码打头 3)手机号码的每一位都是数字 标题:判断手机号码是否合法,输出对应值 说明:函数要求包括: 1)合法则返回0: 2)长度不合法则返回1: 3)包含非数字字符则返回2: 4)不以86开头则返回3. int legal_phone(const string &str){    if(str.size()!=13)//长度的判断    {      return 1;    }    if(str[0]!='8'&&str[1]!

C++ 字符串编程训练3

标题:比较一个数组是否为回文数组 说明:回文数组即从头到尾和从尾到头都是一样的,例如数组{1,2,3,4,5,4,3,2,1}或者数组{1,2,3,4,4,3,2,1}都是回文数组. bool is_huiwen(int A[],int n){    for(int i=0;i<n/2;i++)//n/2是关键,因为不需要再从尾到头比较    {      if(A[i]!=A[n-i-1])//不满足回文要求      {        return false;      }    }   

C++ 字符串编程训练4

这次的题目是一道比较题,将两个数组从后开始对比,如果对比的两个数不一样,则进行计数加1.当其中一个数组已经遍历完了之后,输出计数值,如果该值为0,表示两个数组相同. 标题:输出两个数组不相等的元素个数 说明:定义一个函数int array_compare(int len1,int array1[],int len2,int array2[]),其中len1为array1数组的长度,len2为array2数组的长度.函数返回一个int值的不等个数. int unequal_num(int A[],

(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. 可以和(编程训练)再回首,数据结构--二叉树的前序.中序.后序遍历(递归)对比着看 [问题描述] 根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序.中序.后序遍历. [基本要求] ·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序.中序.后序遍历. ·输入:输入二叉树的顺序存储. ·输出:二叉树的先序.中序.后序遍历序

VC 中 字符串编程

/* #ifdef WIDECHAR//#ifdef  /#ifndef 具有在本文件内向上溯源性  在上面的可以识别  在下面的不能识别 #endif wchar_t *pszText=L"HelloT_char"; wprintf(L"%s\n",pszText); #else char *pszText="HelloT_char"; printf("单%s\n",pszText); #endif */ 对于wchar_t

Qt 编程训练之七

Qt进程间通信 TCP / IP 跨平台的 QtNetwork模块提供的类网络编程便携式和容易. 它提供了高层类(例如,QNetworkAccessManager, QFtp)使用特定的应用层协议通信,低层类(例如, qtcpsocket, QTcpServer, QSslSocket为实现协议). 共享内存 跨平台共享内存类, QSharedMemory提供了访问操作系统的共享内存实现. 它允许安全由多个线程访问共享内存段和过程. 此外,QSystemSemaphore可用于控制对资源的访问共

(编程训练)再回首,数据结构——(升级版)使用栈判断括号匹配

点击打开 基础版 最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. 在VC++6.0下可运行,当初还写了不少注释. /* ********************************************************** * 3-2 * 设在一个算术表达式中允许使用3种括号:圆括号"(".")",方 * 括号"["."]",花括号"

【编程训练-考研上机模拟】综合模拟2-2019浙大上机模拟(晴神)

A - next[i] Problem Description 在字符串匹配的KMP算法中有一个重要的概念是next数组,求解它的过程让不少同学伤透了心.next数组的直接语义其实是:使"长度为L的前缀"与"长度为L的后缀"相同的最大L,且满足条件的前后缀不能是原字符串本身. 例如对字符串"ababa"来说,长度为1的前缀与后缀都是"a",它们相同:长度为2的前缀与后缀分别是"ab"和"ba&qu