#遇到问题的现象#代码出错#已附上代码和报错#C语言求n阶勒让多项式的值
第二行代码都没有分号结尾呀
还有,一个文件里两个main函数是几个意思
你要写代码,就好好搞个IDE,不要用vim来写,它是文本处理工具,不是专业写代码的工具,根本不会提示你到底哪里有语法错误
问题描述
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
解题思路
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
(1) 每个人只有死和活着,因此可以用布尔标记每个人的状态,可用true表示死,false表示活。
(2) 开始时每个人都是活的,所以数组初值全部赋为false。
(3) 模拟杀人过程,直到所有人都被杀死为止。
示例代码(C语言)约瑟夫环 Visual Studio 2019
/**
* 数据结构 C语言 顺序表_约瑟夫问题
* @FileName Seq_Josephus_Problem.c
* @author W.Lionel.Esaka
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//预处理
#define MAXSIZE 200 //数据数组大小 MAXSIZE 方便更改
#define bool int //C语言中没有bool值,用int替换
#define true 1 //用true替换1,用false替换0
#define false 0 //也可以用Correct/Error
typedef int ElemType; //ElemType/Status 元素类型/状态
typedef int Status; //用来指代特定的数据类型
/*定义线性表结构体*/
typedef struct
{
ElemType Data[MAXSIZE]; //Data数组,用来存储线性表数据的“容器”
int Count; //数据个数计数器
} Sequential_linear_table; //Sequential_linear_table(顺序线性表)
//创建线性表(线性表指针,数据数组,数组长度)
void CreateList(Sequential_linear_table* list,int n)
{
int i;
for (i = 0; i < n; i++) //将所给数据数组数据赋值给线性表中的数组
list->Data[i] = i + 1;
list->Count = n; //线性表长度/计数器置为n
}
//判定是否为空表(线性表指针)
bool ListEmpty(Sequential_linear_table* list)
{
return (list->Count == 0); //返回此表达式的值,假为true,真为ture
}
//返回线性表长度值(线性表指针)
int ListLength(Sequential_linear_table* list)
{
return(list->Count); //返回线性表计数器中的值
}
//输出线性表(线性表指针)
void ListDisplay(Sequential_linear_table* list)
{
int i;
if (ListEmpty(list))
{
printf("空表\n");
return; //for循环输出线性表数据数组中的数据
}
for (i = 0; i < list->Count; i++)
{
printf("%4d\t", list->Data[i]);
}
printf("\n");
}
//求某个数据元素值(线性表指针,所查找的数据位置,将所的数据返回给此变量)
bool GetElem(Sequential_linear_table* list, int i, ElemType* e)
{
if (i<1 || i>list->Count) //判断所给位置是否在线性表范围内
return false;
*e = list->Data[i - 1]; //将查找位置的数据返回给所给变量
return true;
}
//按元素值查找元素位置(线性表指针,所查找的数据)
bool LocateElem(Sequential_linear_table* list, ElemType e)
{
int i = 0;
while (i < list->Count&& list->Data[i] != e)
i++; //将所给数据与线性表数组中的数据一一对比查找
if (i >= list->Count) //超出范围返回为false
return false;
else
return i + 1;
}
//插入数据元素(线性表指针,数据插入位置,将要插入的数据)
bool InsertList(Sequential_linear_table* list, int i, ElemType e)
{
int j;
if (i<1 || i>list->Count + 1)
return false; //不在范围内时返回false
i--; //将顺序表逻辑序号转化为数据数组序号
for (j = list->Count; j > i; j--) //将Data数组元素整体后移一位
list->Data[j] = list->Data[j - 1];
list->Data[i] = e; //插入元素e
list->Count++; //顺序表计数器加1
return true; //成功插入返回true
}
//删除数据元素(线性表指针,所要删除数据位置,被删除的数据值)
bool DeleteList(Sequential_linear_table* list, int i, ElemType e)
{
int j;
if (i<1 || i>list->Count) //不在范围内时返回false
return false;
i--; //将顺序表逻辑序号转化为物理序号
e = list->Data[i]; //将被删除数据值赋值给e
for (j = i; j < list->Count - 1; j++) //将Data数组元素整体前移一位
list->Data[j] = list->Data[j + 1];
list->Count--; //顺序表计数器减1
return true; //成功删除返回true
}
//入口函数
int main()
{
//游戏初始数值定义
printf("\n |约瑟夫问题测试| \n=-=-=-=-=-=-=-=-=-=-=\n");
ElemType value = 0;
int n,m,i = 1,Number_Off = 1;
printf("输入参与游戏的总人数n:");
scanf("%d", &n);
printf("输入报数上限m:");
scanf("%d", &m);
if (n > 200)
{
printf("超过游戏人数上限,程序退出\n");
exit(0);
}
//线性表初始化
Sequential_linear_table seqlist;
Sequential_linear_table* list = &seqlist;
//创建本局游戏
CreateList(list, n);
printf("\n本局游戏创建成功\n本局游戏人数为%d\n报名上限为%d\n", ListLength(list),m);
//游戏开始
while ( list->Count > 1 )
{
if (Number_Off == m)
{
DeleteList(list,i,value);
Number_Off = 1;
}
else
{
i++;
Number_Off++;
}
if ( i > list->Count )
{
i = 1;
}
}
printf("\n最后获胜的人的编号为");
ListDisplay(list);
return 0;
}