正文

Jos问题2005-08-14 16:25:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/billgacsli/3797.html

分享到:

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

阅读(3168) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册