• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
qyk123
博客园    首页    新随笔    联系   管理    订阅  订阅
C语言实验报告八——指针

题目:

利用指针编写程序

有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。

分析:约瑟夫问题!

  1. 设置控制台颜色:

    • 使用 system("color f3"); 设置控制台的前景色为白色,背景色为淡蓝色。
  2. 变量声明和输入:

    • 声明整数变量 i、k、m、n,以及整数数组 num 和指针 p。
    • 用户输入变量 n 表示总人数。
  3. 填充数组:

    • 使用循环将数组 num 填充为1到n的整数。
  4. 模拟报数和出局:

    • 使用 i 进行循环遍历数组,k 记录报数,m 记录出局人数。
    • 如果当前元素不为0,说明该人还在圈内,增加 k。
    • 当 k 达到3时,表示该人出局,将该位置的元素置为0,k 归零,m 增加1。
    • 循环直到 m 达到n-1,即只剩下一个人。
  5. 找到最后剩下的人:

    • 利用循环找到数组中第一个不为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环境下可能不生效。这部分代码主要是用于设置控制台颜色,如果不需要可以移除或替换为其他合适的设置。
posted on 2024-02-21 14:32  qiyukun  阅读(67)  评论(0)    收藏  举报  来源
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3