有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下来的是原来的第几位(指针方法处理)。——C语言

1 概述

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下来的是原来的第几位(指针方法处理)。——C语言

2 解法
//C程序设计第五版(谭浩强)
//章节:第八章 善于利用指针 
// 所有练习均要求用指针方法处理 
//练习8.5 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下来的是原来的第几位。
#include <stdio.h>

int main()
{
	void number_off(int *p, int n);
	int num[100],*p=num,n,i;
	printf("总共有多少个人参加:");
	scanf("%d", &n);
	for(i=1;p<num+n;p++){  // 用顺序数来保存位数 ,最后那一位还有数,那么就是它留下来了 
		*p=i++;
	}
	number_off(num, n);
	for(p=num;p<num+n;p++){  
		if(*p){
			printf("最后留下来的是原来的第%d位",*p);
			break;
		}
	}
	return 0;
} 

void number_off(int *p, int n)
{
	int *first=p, count=0, i=0, k=0, rest=n;
	while(rest!=1){  // 当还剩下一位时 
		if(*(first+i)!=0){  // 说明这个数还没退出圈
			k++;  //报数 
			if(k==3){
				count++;  // 退出人数 
				*(first+i) = 0;  // 退出 
				k=0;
			}
		} 
		i++;
		if(i==n){  // 这就形成一个圈了呀! 
			i=0; 
		}
		rest = n-count; 
	}
} 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangpaopao0609

看星空看日落不如看我的眼眸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值