鱼C论坛

 找回密码
 立即注册
查看: 2431|回复: 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

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

代码其实也不难
#include<stdio.h>
#include<malloc.h>

#define MAX 41

int n = 0;

typedef struct People
{
        int data;
        struct People * next;
}p;

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

int main()
{
        p *head;
        head = create();
        calc(head);
        printf("\n");

        //print(head);
        

        return 0;
}

p * create()
{
        p * head;
        head = (p*)malloc(sizeof(p));
        p * p1;
        p1 = (p*)malloc(sizeof(p));
        head->data = 1;
        head->next = NULL;
        p1->data = 1;
        p1->next = NULL;
        int i;
        for ( i = 0; i < MAX; i++)
        {
                if (n ==0)
                {
                        head->next = (p*)malloc(sizeof(p));
                        head->next->data = 1;
                        p1->next = head->next;
                        n++;
                }
                else
                {
                        p1->next->next = (p*)malloc(sizeof(p));
                        p1->next = p1->next->next;
                        p1->next->data = 1;
                        n++;
                }
        }
        p1->next->next = head;
        return head;
}

void print(p * head)
{
        p * p1;
        p1 = head;
        n = 0;
        while (p1->next != head)
        {
                if (p1->data)
                {
                        printf("第%d个人:活\n",n+1);
                }
                else
                {
                        printf("第%d个人:死\n",n+1);
                }
                p1 = p1->next;
                n++;
        }
}

void calc(p * head)
{
        int i = 1, j = 1;
        p * p1;
        p1 = head;
        n = 41;
        while (n != 2)
        {
                if (i != 3)
                {
                        if (p1->data)
                        {
                                i++;
                        }
                }
                else
                {
                        if (p1->data)
                        {
                                i = 1;
                                p1->data = 0;
                                n--;
                                printf("%-5d", j);
                        }
                }
                p1 = p1->next;
                if (j != MAX)
                {
                        j++;
                }
                else
                {
                        j = 1;
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 08:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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