当前位置:编程学习 > C/C++ >>

急急急!!!求c++程序

编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:
  m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?
输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列。
补充:此题为期末考试课程设计    请发到邮箱  595615347@qq.com

答案:
//解决约瑟夫环问题
//预编译命令
#include "iostream.h"//c++程序的标准输入输出头文件
#include "conio.h"//程序最后用到getch();语句,这是它的头文件
//定义单链存储结构
typedef struct LNode{
unsigned long serial;//各节点序号,用于输出出列顺序
unsigned long password;//各节点密码
struct LNode *next;//链表指针
}LNode,*LinkList;
//约瑟夫环主程序
void main()
{
unsigned long m,n,i; //定义初始报数上限值m、人数n、循环控制变量i为无符号长整型变量
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<cout<<" Joseph Ring 2005 Lite! 简体中文正式版"<cout<<" CopyRight 2005 09 23 of Empire_Lenin @ USTC EEIS"<cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< cout<<"输入随机数m(正整数):";
cin>>m;
cout<<"输入人数n:";
cin>>n;
cout<<"输入各人的密码(密码为正整数,回车确认每一个输入,空格亦可):"<LinkList p,head;//定义指针变量p和头指针head
head=new LNode;//开辟头结点,本问题亦可不设头结点,此处为了更容易实现本思想,故设之
head->serial=0;//以下两行对头结点元素赋值,头结点元素值无意义,赋值为了保证程序的健壮
head->next=0;
p=head;//定义指针变量p初始为指向头结点
LinkList s;//定义指针变量s
//初始化单向循环链表
for(i=1;i<=n;i++)
{
s=new LNode;//开辟新节点,并将新节点的地址赋给LNode型指针变量s
s->serial=i;//对新开辟的节点的序号元素赋值
cin>>s->password;//输入新开辟节点的密码
p->next=s; //新节点链接入链表
p=p->next; //指针变量p前进
}
p->next=head->next;//将表尾节点链接到表头,完成单向循环链表的建立
//链表初始化完成,下面输出出列节点序列
cout<p=head;//置LNode型指针变量于头结点处
unsigned long counter1=1;//计数器,用于显示节点出列序号
//下面程序段以一个while嵌套语句完成按要求寻找节点、删除、返回数据等操作
//此种写法思路简洁明确,易读性高,完全优于用数组画蛇添足
while(n!=0){//节点出列完也就是链表长度递减到0之前,一直执行下述循环
while(m>n) m=m-n;//如果m值大于链表长度,求出在链表长度范围内的m值
unsigned long counter2=1;//计数器,用于标记和m值匹配的、指针变量p的移动步数
while(m!=counter2){//找到和m值匹配的节点
p=p->next;
++counter2;
}
//此为简化版,使用直接打印出列序列的语句
if(counter1>=10&&counter1%10==0) cout<else cout<next->serial<<" ";//输出出列节点序号
m=p->next->password;//在节点删除之前将该节点的密码赋给m,用以执行下次循环
p->next=p->next->next;//删除该节点
--n;//链表长度自减一
++counter1;//计数器累进
}//while语句结束,当不满足循环条件时跳出
//由于是命令行程序,故使用下面语句防止结果显示后程序马上退出造成看不见结果
cout<#include "math.h"
#include "iostream.h"
void main()
{
unsigned long n;
unsigned long i;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<cout<<" 本程序用于判断一个数是不是素数\n";
cout<<" CopyRight 2005 09 22 of Empire_Lenin @ USTC EEIS\n\n";
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<cout<<"请输入一个正整数:";
cin>>n;
cout<for(i=2;i<=sqrt(n);++i){
if(n%i!=0) continue;
else cout<<"这个数不是素数.\n\n"<<"原因是 "<getch();
}

上一个:C++怎么产生随机数?
下一个:现在关于C++培训机构比较好?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,