Spperman


私信TA

用户名:fan

访问量:63012

签 名:

优秀的程序员是没有女朋友的...

等  级
排  名 64
经  验 10125
参赛次数 0
文章发表 66
年  龄 19
在职情况 学生
学  校 河南师范大学
专  业 物联网

  自我简介:

单身是因为——太优秀了...

TA的其他文章

解题思路:

将每个人糖果的一半分给下一个人,首先自然而然想到用数组记录每人的糖果数,i=1 表示从第一个开始,

其次  每人分出去一半,是同时进行,不是从一开始顺序分出一半,这是两种解法。

关于记录分出去的一半糖果数,我也是用另一个数组记录,其次就是数学与逻辑的整合啦,看代码吧!



注意事项:

此题注意理解题意要理解透彻,把过程想明白。


参考代码:

#include<stdio.h>
main()
{
     int n,i,f,m,c=0;
    int a[100],b[100];
    scanf("%d",&n);                     //输入n个人
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);             // 输入每个人的初始糖果数
    }
    while(1)
    {
        f=1;                                 // f=1,用来下面判断是否每人糖果数一致
        for(i=1;i<=n;i++)
        {
            a[i]=a[i]/2;                   //首先同时发生,先让每个人糖果数目减半
            b[i]=a[i];                      //减少的就是要分给下一个人的,用b数组记录
        }
        b[0]=b[n];                       //此处给b【0】赋予最后一个人分发的糖果数
        for(i=1;i<=n;i++)            //(i从1开始)可以使每个人得到的糖果都来源于下一个人  a[i]=a[i]+b[i-1];           

      {
            a[i]=a[i]+b[i-1];          //每一轮分糖果,每个人最后的糖果数
        }

        for(i=1;i<=n;i++)
    {
        if(a[i]%2!=0)
        {

            a[i]=a[i]+1;
            c++;                        //如果不是偶数,则c(补充的糖果数)+1
        }
    }
        for(i=1;i<n;i++)
    {
         if(a[1]!=a[i+1])
        {
           
           f=0;                  //  如果都不等于第一个人的数目,大家数目不一样,f为0,继续循环
        }
    }

    if(f==1)
    {
        break;             // 一样。则跳出while循环,输出增加糖果数目
    }
    }
    printf("%d",c);




    }



 

0.0分

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

这个最后不相等为啥f=0啊,等于0为假,不就进不去循环了嘛,不应该是不相等让f=1嘛,好进入循环,佬
2022-08-14 16:01:56
佬,我没太弄懂这题的意思,如果是三个人,第一个给第二个,第二个给第三个。第三个是给第二个吗?第三个的左手边是第一个还是第二个
2022-08-14 14:26:43
int fun(int N, int a[])//判断每个小朋友的糖果是否相等
{
	for (int i = 0; i < N-1; i++)
	{
		if (a[i] != a[i + 1])
			return 0;
	}
	return 1;
}

int main()
{
	int N, a[100], b[100], i, k=0;
	scanf("%d", &N);
	for ( i = 0; i < N; i++)
	{
		scanf("%d", &a[i]);
	}
	while (!fun(N,a))//不相等进入循环
	{
	
		for (i = 0; i < N; i++)//利用两个数组,我这b[]是从1开始的,将a[]里的元素分一半给b
		{
			b[i+1] = a[i] / 2;
			a[i] = b[i+1];
		}
		for (i = 1; i < N; i++)//从第二个元素开始a,b元素一一相加
		{
			a[i] += b[i];
		}
		a[0] =a[0] + b[N];//a[0]和b[N]相加
		for (i = 0; i < N; i++)
		{
			if (a[i] % 2 != 0)//判断每个小朋友的糖果是否为偶数
			{
				a[i] += 1;
				k++;
			}
		}
2022-07-05 22:18:17
请问最后一个for循环为什么不用<=n啊,前面不都是小于等于吗
2022-03-09 17:10:14
明天省赛,回来看看
2019-05-05 13:14:57
/* 3
2          2      4
1         1       2
1+1=2    1+2=3   2+1=3
  2       4      4  
  1       2      2
  2       2      2*/ 
#include<stdio.h>
int main(){
	int a[105];
	int n,sum=0;//标记补发的糖果 
	scanf("%d",&n);
	int i,z;
	int tag;
	for(i=0;i<n;i++){//输入每个小孩的糖果数量 
		scanf("%d",&a[i]);
	}
	while(1){//开始循环 
		tag=0;//作为标记 
		if(a[0]%2==0){
			z=a[0]/2;// Z 为第一个小孩减半后的糖果数量 
		}
		else{
			z=(a[0]+1)/2;
		}
		for(i=0;i<n;i++){
			if(a[i]%2==1){//从头至尾 糖果数若是双数则直接减半  单数就加一在减半  记入补发的数目 
				a[i]+=1;
				sum++;// 单数的情况  将补发的糖果数 记入 
			}
			a[i]/=2;
			if(a[i]!=z){
				tag=1;//若是 有小孩的糖果数不等于第一个小孩的数目  则
2019-04-19 08:22:34
while(1)
    {
        f = 1;
        for (i=n-1; i>=0; i--)
        {
            a[i] += a[(i+1)%n]/2;
            a[(i+1)%n] = (a[(i+1)%n]+1)/2;
        }
        for (i=0; i<n; i++)
        {
            if (a[i]%2 == 1)
            {
                len++;
                a[i] += 1;
            }
        }
        for(i=0;i<n-1;i++)
        {
            if(a[0]!=a[i+1])
            {
                f = 0;                 
            }
        }
        if(f==1)
        {
            break;            
        }
    }
怎么就超时了呢?
2019-03-11 20:28:09
b[i]=a[i];                      //较少的就是要分给下一个人的,用b数组记录
这句不懂
2019-03-02 10:31:04