永发信息网

c++编程求助

答案:4  悬赏:70  手机版
解决时间 2021-04-22 10:28
设有n个人围坐一圈,现从指定的第一个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人出列,……,如此反复,直到所有的人出列为止。
最佳答案

从指定的第一个人开始报数? 从哪开始是指定的? 还是从第一个开始?

全部回答

程序代码:

#include <iostream.h> void main() { int i,n,m; int s=0,p=0; int a[20];//最大人数 while(1) { cout<<"Please input person number:"<<endl; cin>>n; cout<<"Please input m:"<<endl; cin>>m;

if(n<1||n>20) { cout<<"n too small or too large~!"<<endl; break; } for(i=0;i<n;i++) a[i]=1;

for(i=0;i<n;i++,i%=n) { s+=a[i]; if(s==m) { s=0;a[i]=0;p++; cout<<p<<"--->"<<i+1<<endl; if(p==n)break; } } } }

运行结果:

我是用C语言编的,和c++一样,只需要改一下输出语句。

main() { int a[30]; int k,i,j,m=9; for (i=0;i<30;i++) { a[i]=30; } i=0; for(k=1;k<=30;k++) { j=0; while(j<m) { if(a[i]==30)j++; if(j==m)a[i]=k; i=(i+1)%30;

}

} for(k=0;k<30;k++) { printf("%d ",a[k]); }

}

约瑟夫问题

#include "stdafx.h"

#include <iostream> #define OK 1 #define ERROR 0 #define NULL 0 #define OVERFLOW -1 using namespace std;

typedef struct Node{ int data; Node *next; }*PNode;

typedef struct Qlink{ PNode front, rear; int size; }Queue;

int InitQueue(Queue* Q){ (*Q).front=Q->rear=(PNode)malloc(sizeof(Node)); if(!(*Q).front) exit(OVERFLOW); (*Q).front->next = NULL; Q->size=0; return OK; }

int DestroyQueue(Queue *Q) { // 将Q清为空队列 // PNode p,q; int c = Q->size; (*Q).rear=(*Q).front; p=(*Q).front->next; (*Q).front->next=NULL; while(p&&c>0) { q=p; p=p->next; free(q); c--; } return OK; }

int EnQueue(Queue *Q,int e) { // 插入元素e为Q的新的队尾元素 // PNode p=(PNode)malloc(sizeof(Node)); if(!p) // 存储分配失败 // exit(OVERFLOW); p->data=e; p->next=(*Q).front->next; (*Q).rear->next=p; (*Q).rear=p; Q->size++; return OK; } int DeQueue(Queue *Q,int *e) { // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR // PNode p; if((*Q).front==(*Q).rear) return ERROR; p=(*Q).front->next; *e=p->data; (*Q).front->next=p->next; (*Q).rear->next=(*Q).front->next; if((*Q).rear==p) (*Q).rear=(*Q).front; free(p); Q->size--; return OK; }

int QueueTraverse(Queue* Q,void(*vi)(int)) { // 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败 // PNode p; p=Q->front->next; int count = 0; while(p&& count<Q->size) { vi(p->data); p=p->next; count++; } printf("\n"); return OK; }

void visit(int e){ printf("%d ", e); }

void gotoNumberNode(Queue* Q, int number,PNode &p) { // p=Q->front->next; for(int j=1;j<number;j++) p=p->next; }

void gameBegin(Queue* Q, int number, int deadnumber, int beginnumber){

for(int i=1; i<=number; i++) EnQueue(Q, i);

printf("这%d人的序号分别为:\n", number); QueueTraverse(Q,visit); printf(" \n"); PNode p=Q->front->next; gotoNumberNode(Q, beginnumber, p); //标尺移动第S人处,准备报数

printf("出列人的队列为:\n");

do{ gotoNumberNode(Q, deadnumber-1, p); //开始报数

PNode Dodetodelect= p->next; //第m个人出列

if (p->next==Q->front->next) { p->next=(p->next)->next; (*Q).front->next=p->next; }else p->next=(p->next)->next; Q->size--;

printf("第%d人\t",Dodetodelect->data); delete Dodetodelect; p=p->next;

}while(Q->size!=1); //保留一人,最后一人活了下来

printf("\n------------------------\n最后活下来的人是第%d人\n",p->data );

}

int main(){

int number,deadnumber, beginnumber; printf("输入游戏人数:"); scanf("%d", &number); printf("输入死亡号码:"); scanf("%d", &deadnumber);

beginnumber =1;

if (beginnumber > number) { printf("数字不能大于人数,重新输入:"); scanf("%d", &beginnumber); }

Qlink Q; InitQueue(&Q); gameBegin(&Q, number, deadnumber, beginnumber);

system("PAUSE"); DestroyQueue(&Q);

return 0; }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
富丽百年沙发店我想知道这个在什么地方
珀莱雅和玉兰油哪个好,自然堂,水密码,法兰琳
我的第一次,就在来月经的第四天,不知道是否
孩子晚上饿怎么办?
qq想改密码但是以前申请号的时候忘记密保问题
女的不让抱怎么办?
部门给领导生日祝福语,父亲生日祝福语 100字
办一个小型香皂加工需要什么机器~谢谢`
景旺商行地址在什么地方,想过去办事
新疆是个什么样的地方呢?
手机宠物(狗狗)挖宝 风结符 一般都在数字几
有关做人要善良的句子,形容女孩善良句子
JJ新专辑
诺基亚是触摸机好还是键盘机好呢?5800跟N95
DNF我驱魔35了,装备怎么穿?
推荐资讯
中级电工证用一年一检不?
为什么小孩到八岁了,还没掉牙齿
幸福一生婚纱摄影地址有知道的么?有点事想过
抗菌洗衣宏鑫店地址在什么地方,想过去办事
有关庐山的名句
为什么我的C盘备份不了
滴滴滴是什么意思,滴滴快车什么时候跑单才加
爱情中表示忠心的句子,马云说的关于勇往直前
请问破天一剑最多能升到几级?
伤感的日语句子,伤感日语签名
英语首字母填空 关于用报纸来学英语的
成都到邛崃多少公里,成都到邛崃怎么走需要多
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?