永发信息网

c++编程求助

答案:4  悬赏:70  手机版
解决时间 2021-04-22 10:28
  • 提问者网友:难遇难求
  • 2021-04-21 12:37
设有n个人围坐一圈,现从指定的第一个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人出列,……,如此反复,直到所有的人出列为止。
最佳答案
  • 五星知识达人网友:独钓一江月
  • 2021-04-21 12:53

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

全部回答
  • 1楼网友:詩光轨車
  • 2021-04-21 15:11

程序代码:

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

运行结果:

  • 2楼网友:舊物识亽
  • 2021-04-21 14:36

我是用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]); }

}

  • 3楼网友:不甚了了
  • 2021-04-21 14:18

约瑟夫问题

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

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯