有n个人围成一圈,按从1到n顺序编号。然后从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。其中,n的值应从键盘输入。目前,仅编写完成了main函数,请编写其它三个函数:inputArr、printArr、JosephCircle,各函数功能含义及接口定义如下所示。c语言大学内容
时间: 2023-12-06 16:45:22 浏览: 122
1. inputArr函数:用于输入人数n,创建一个大小为n的数组arr,并将数组arr中的元素初始化为1~n。函数接口定义如下:
```c
int* inputArr(int n);
```
函数返回值为一个int类型的指针,指向创建的数组arr。
2. printArr函数:用于输出数组arr的所有元素。函数接口定义如下:
```c
void printArr(int* arr, int n);
```
其中,arr为一个int类型的指针,指向需要输出的数组,n为数组的大小。
3. JosephCircle函数:用于模拟约瑟夫环的过程,返回最后留下的人的编号。函数接口定义如下:
```c
int JosephCircle(int* arr, int n);
```
其中,arr为一个int类型的指针,指向存储人员编号的数组,n为数组的大小。
完整代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
int* inputArr(int n);
void printArr(int* arr, int n);
int JosephCircle(int* arr, int n);
int main()
{
int n;
printf("请输入人数n:");
scanf("%d", &n);
int* arr = inputArr(n);
printf("原始数组:\n");
printArr(arr, n);
int last = JosephCircle(arr, n);
printf("最后留下的人的编号是:%d\n", last);
free(arr);
return 0;
}
int* inputArr(int n)
{
int* arr = (int*)malloc(n * sizeof(int));
for(int i=0; i<n; i++)
{
arr[i] = i+1;
}
return arr;
}
void printArr(int* arr, int n)
{
for(int i=0; i<n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int JosephCircle(int* arr, int n)
{
int count = 0;
int index = 0;
while(n > 1)
{
if(arr[index] != 0)
{
count++;
if(count == 3)
{
arr[index] = 0;
count = 0;
n--;
}
}
index++;
if(index == n)
{
index = 0;
}
}
int last = 0;
for(int i=0; i<n; i++)
{
if(arr[i] != 0)
{
last = arr[i];
break;
}
}
return last;
}
```
阅读全文