Jos问题n个人围成一圈,从1开始顺序报数,报到m的退出,再从1开始报数,直到仅剩一个人为止。输出出列序列。#include<stdio.h>#include<malloc.h> struct Man{ int num; struct Man *next;}; void Jos(int n,int m = 3){ struct Man *head, *p, *b, *t; int i; head=(struct Man*)malloc(sizeof head); p = head; b = head; for(i = 1;i < n;i++){ //创建循环单链表 p->num = i; p->next = (struct Man*)malloc(sizeof p->next); p = p->next; } p->num = n; p->next = head;//创建完毕 //开始报数 p = head; i = 0; do{ if(++i == m){ //报到3 i = 0; //重新开始报数 printf("%5d",p->num);//输出 //出列,删除节点 t = p; b->next = p->next; p = p->next;// free(t);//为什么不行呢????????? continue; } b = p; p = p->next; }while(p->next != p); printf("%5d",p->num);//输出最后一个出列的}; void About()//说明信息{ printf("************************************************\n"); printf(" JOS 问题 \n"); printf(" Jos问题,n个人围成一圈,从1开始顺序报数,报\n"); printf("到m出列,输出出列顺序。\n"); printf(" \n"); printf("************************************************\n");}; int main(){ About(); int n = 0, m = 0; while(true){ n = 0; m = 0; while(n <= 0){ fflush(stdin); //刷新缓冲区 printf("\n请输入总人数n(正整数,-1退出):"); scanf("%d",&n); if(n == -1)break;//退出 } if(n == -1)break; while(m <= 0){ fflush(stdin); //刷新缓冲区 printf("\n请输入m:"); scanf("%d",&m); } Jos(n, m); printf("\n"); } return 0;}

评论