鱼C论坛

 找回密码
 立即注册
查看: 2293|回复: 1

[技术交流] 约瑟夫问题

[复制链接]
发表于 2015-8-13 15:45:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 牡丹花下死做鬼 于 2015-8-13 15:47 编辑

约瑟夫问题:简单来说就是 比如一共10个人 1 2 3 4 5 6 7 8 9 10
从第一个人开始 第三个人就死然后从下一个人继续从一开始数到三死
也就是说 3 6 9三个人先死了
然后10号人就是从一接着继续  1 2 4 5 7 8 10  10号一 一号2 二号3 然后二号死了 四号 1......
要求用代码写出人死亡的顺序

123.png

这个我想所有教程讲到链表都会讲到这个问题的把~~

代码其实也不难

  1. #include<stdio.h>
  2. #include<malloc.h>

  3. #define MAX 41

  4. int n = 0;

  5. typedef struct People
  6. {
  7.         int data;
  8.         struct People * next;
  9. }p;

  10. p * create();//创建链表
  11. void print(p * head);//输出当前全部人死活状况
  12. void calc(p * head);//约瑟夫问题计算

  13. int main()
  14. {
  15.         p *head;
  16.         head = create();
  17.         calc(head);
  18.         printf("\n");

  19.         //print(head);
  20.        

  21.         return 0;
  22. }

  23. p * create()
  24. {
  25.         p * head;
  26.         head = (p*)malloc(sizeof(p));
  27.         p * p1;
  28.         p1 = (p*)malloc(sizeof(p));
  29.         head->data = 1;
  30.         head->next = NULL;
  31.         p1->data = 1;
  32.         p1->next = NULL;
  33.         int i;
  34.         for ( i = 0; i < MAX; i++)
  35.         {
  36.                 if (n ==0)
  37.                 {
  38.                         head->next = (p*)malloc(sizeof(p));
  39.                         head->next->data = 1;
  40.                         p1->next = head->next;
  41.                         n++;
  42.                 }
  43.                 else
  44.                 {
  45.                         p1->next->next = (p*)malloc(sizeof(p));
  46.                         p1->next = p1->next->next;
  47.                         p1->next->data = 1;
  48.                         n++;
  49.                 }
  50.         }
  51.         p1->next->next = head;
  52.         return head;
  53. }

  54. void print(p * head)
  55. {
  56.         p * p1;
  57.         p1 = head;
  58.         n = 0;
  59.         while (p1->next != head)
  60.         {
  61.                 if (p1->data)
  62.                 {
  63.                         printf("第%d个人:活\n",n+1);
  64.                 }
  65.                 else
  66.                 {
  67.                         printf("第%d个人:死\n",n+1);
  68.                 }
  69.                 p1 = p1->next;
  70.                 n++;
  71.         }
  72. }

  73. void calc(p * head)
  74. {
  75.         int i = 1, j = 1;
  76.         p * p1;
  77.         p1 = head;
  78.         n = 41;
  79.         while (n != 2)
  80.         {
  81.                 if (i != 3)
  82.                 {
  83.                         if (p1->data)
  84.                         {
  85.                                 i++;
  86.                         }
  87.                 }
  88.                 else
  89.                 {
  90.                         if (p1->data)
  91.                         {
  92.                                 i = 1;
  93.                                 p1->data = 0;
  94.                                 n--;
  95.                                 printf("%-5d", j);
  96.                         }
  97.                 }
  98.                 p1 = p1->next;
  99.                 if (j != MAX)
  100.                 {
  101.                         j++;
  102.                 }
  103.                 else
  104.                 {
  105.                         j = 1;
  106.                 }
  107.         }
  108. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-13 16:00:02 | 显示全部楼层
前排支持
@小甲鱼  快出C教程啊 不是说要重录吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 11:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表