题目:
利用指针编写程序
有n个学生围成一圈,按顺序排号。从第1个人开始报数,凡报到3的人退出圈子,问最后留下的是原来第几号的学生。
要求及提示:
(1)n的值输入,输出最后留下的学生的顺序号
(2)用数组来存储n个学生。
(3)解题思路提示
step1:先利用数组开辟足够大的一个存储空间,指针P指向数组;
step2:输入n值,为这n个人编号;
step3:定义3个循环时所需计数变量
每次循环时的计数变量i,目的是控制指针是否指向了最后一个人,如果指向了最后一个人,则要使指向重新指向第一个人; 控制报数的变量k,目的是:按1、2、3报数时的计数变量。k为3时,将此人的编号设置为0,k重新计数;标识退出人数的变量m.目的是:记录已退出多少人,为循环结束做准备。
step4:循环继续条件:n-m>1。
分析:约瑟夫问题!
-
设置控制台颜色:
- 使用
system("color f3");
设置控制台的前景色为白色,背景色为淡蓝色。
- 使用
-
变量声明和输入:
- 声明整数变量
i
、k
、m
、n
,以及整数数组num
和指针p
。 - 用户输入变量
n
表示总人数。
- 声明整数变量
-
填充数组:
- 使用循环将数组
num
填充为1到n的整数。
- 使用循环将数组
-
模拟报数和出局:
- 使用
i
进行循环遍历数组,k
记录报数,m
记录出局人数。 - 如果当前元素不为0,说明该人还在圈内,增加
k
。 - 当
k
达到3时,表示该人出局,将该位置的元素置为0,k
归零,m
增加1。 - 循环直到
m
达到n-1,即只剩下一个人。
- 使用
-
找到最后剩下的人:
- 利用循环找到数组中第一个不为0的元素,输出即为最后剩下的人的编号。
代码:
int main()
{
system("color f3");
int i, k, m, n, num[50], * p;
printf("input the number of n:");
scanf("%d", &n);
p = num;
for (i = 0; i < n; i++)
*(p + i) = i + 1;
i = 0;
k = 0;
m = 0;
while (m < n - 1)
{
if (*(p + i) != 0)
k++;
if (k == 3)
{
*(p + i) = 0;
k = 0;
m++;
}
i++;
if (i == n) i = 0;
}
while (*p == 0) p++;
printf("%d", *p);
return 0;
}
- 在实现约瑟夫环问题时,需要注意数组的下标和循环变量的控制,确保正确模拟报数和出局的过程。
- 输入的人数
n
应该合法,不能为负数或零。 - 由于代码中使用了
system("color f3");
,这段代码在不同的编译环境中可能表现不同,有些编译器可能不支持该语句,或者在非Windows环境下可能不生效。这部分代码主要是用于设置控制台颜色,如果不需要可以移除或替换为其他合适的设置。