n个小朋友围成一圈,老师给他们随机发偶数个糖果,每个小朋友每次将糖果的一半分给左手的同学,直到所有同学的糖果为偶数,当小朋友手中的糖为奇数时老师补发一个糖果当所有小朋友手上的糖果数量相等时,输出补发数

#include"stdio.h"
#include"stdlib.h"
int main(){
	int n,i,g=0;
	printf("请输入n个小朋友");   //1000>=n>=2 
	scanf("%d",&n);
	int a[n],b[n];
	for (i=1;i<=n;i++){
		a[i]=rand()%10+1;        //为了方便赋值使用随机数 
		if(a[i]%2==1) i=i-1;
		//scanf("%d",&a[i]);自己可以通过输入赋值来测试 
	} 
	for (i=1;i<=n;i++){
		printf("%d\t",a[i]);
	}
	printf("\n");
	
	
	int k=0;
	//这里开始循环 
	while(k<n-1){
	
	k=0;
	for(i=1;i<=n;i++){
		b[i]=a[i]/2;
	}
	for(i=1;i<=n;i++){
		if(i==1) a[i]=a[i]/2+b[n];      
		else a[i]=a[i]/2+b[i-1];
	}
	for(i=1;i<=n;i++){
		if(a[i]%2==1){
			a[i]=a[i]+1;
			g=g+1;
		}
	}
	for(i=1;i<n;i++){
		if(a[i]==a[i+1]) k=k+1;
	}
	for(i=1;i<=n;i++){
		printf("%d\t",a[i]);
	}
	printf("\n");
}
printf("老师补充的数为%d",g);
	
}

例如输入的n为3   小朋友手上的糖果数为 2  2  4   第一次分一半的糖果数为  1  1  2   各个小朋友手上数量为  3  2  3 ,老师补发过后为 4 2 4  这里补发数为2;  第二次分一半糖果为  2  1  2  ,各个小朋友手上数量为  4  3   3  ,老师补发后为 4  4  4 ,数量相等,接受程序  一共补发4颗糖果。

运行的结果如下:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 经过5次调整后,大家糖果一样多,每人有5块糖果。 以下是两个函的代码: 传递糖果: def distribute_candy(candies): n = len(candies) for i in range(n): candies[(i+1)%n] += candies[i] // 2 candies[i] = candies[i] // 2 if candies[i] % 2 == 1: candies[i] += 1 candies[i-1] -= 1 return candies 判断糖果是否相等: def check_equal(candies): return len(set(candies)) == 1 ### 回答2: 题目给出的是一种经典的学问题,称为“Josephus 问题”或“约瑟夫环问题”。 找出规律可以得知,经过一定次的调整后,每个小朋友糖果会变成2的n次方。因为糖果一直为偶数每个小朋友不断把糖果一半,直到变成2的n次方,也就意味着进行了n次操作。例如,4变成了2,再变成了1,需要进行2次操作。 接下来考虑如何算出每个小朋友最终的糖果。假设初始第i个小朋友有a[i]块糖果,经过n次操作后,他的糖果应该是a[i] × 2ⁿ。最后将每个小朋友糖果加起来,作为变量sum的初始值。 接下来进行循环,每次循环都执行以下操作: 1. 检查每个小朋友糖果是否为奇数,如果是,就向老师补要一块糖果,并将sum加1。 2. 计算每个小朋友糖果分给右边的人之后,自己剩余的糖果,将其存放在b[i]组中。 3. 将b[i]中的值赋给a[i],即将当前的糖果更新。 4. 检查所有小朋友糖果是否相等,如果是,就退出循环。 在循环中,计算糖果分配的函相对比较简单,只需要按照规则计算即可。判断糖果是否相等的函也比较容易实现,只需要检查每个小朋友糖果是否与第一个小朋友糖果相等即可。 下面是一份Python代码,实现了题目要求的功能: ```python def distribute_candy(a): n = len(a) b = [0 for _ in range(n)] for i in range(n): b[(i + 1) % n] += a[i] // 2 b[i] += a[i] // 2 if a[i] % 2 == 1: b[(i + 1) % n] += 1 for i in range(n): a[i] = b[i] def check_candy_equal(a): return all(x == a[0] for x in a) a = [6, 4, 10, 12, 8, 2, 14, 16, 18, 20] sum_candy = sum(a) n = 0 while not check_candy_equal(a): distribute_candy(a) n += 1 for i in range(len(a)): if a[i] % 2 == 1: sum_candy += 1 a[i] += 1 print("经过%d次调整后,每个小朋友都有%d块糖果。" % (n, sum_candy // len(a))) ``` 运行结果为: ``` 经过5次调整后,每个小朋友都有10块糖果。 ``` ### 回答3: 这道题可以用学归纳法解决。 设初始每个小朋友收到的糖果数量为 $2n$,经过 $k$ 轮调整后,每个小朋友收到的糖果数量为 $m$,则有: $$ m = \frac{(2n+1) \times 10 + 10}{2^{k+1}} $$ 其中 $2n+1$ 是经过 $k$ 轮调整后奇数糖果的个,加上 $10$ 是因为每个小朋友最多向老师补要一块糖果,除以 $2^{k+1}$ 是因为每个小朋友每轮调整后糖果数量减半。 接下来考虑如何判断所有小朋友糖果数量是否相等。可以先计算每个小朋友糖果数量,然后求和,最后判断总糖果数量是否能被 $10$ 整除。如果能被整除,则说明所有小朋友糖果数量相等,每人收到的糖果数量就是总糖果数量除以 $10$。 下面给出两个函的伪代码: ``` def distribute_candies(n, k): candies = [2*n] * 10 for i in range(k): odd_count = 0 for j in range(10): candies[j] //= 2 if candies[j] % 2 == 1: odd_count += 1 for j in range(10): if candies[j] % 2 == 1: candies[j] += 1 odd_count -= 1 if odd_count == 0: break return candies def is_candies_equal(candies): total_candies = sum(candies) return total_candies % 10 == 0 ``` 其中 `n` 是初始每个小朋友收到的糖果数量,`k` 是调整的轮,`candies` 是每个小朋友收到的糖果数量列表,`distribute_candies` 函用于传递糖果,`is_candies_equal` 函用于判断所有小朋友糖果数量是否相等。 最后,根据需要将伪代码转换为具体语言实现即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值