杭电ACM 2015 不能AC(有注释)

2024-12-04 05:33:33
推荐回答(2个)
回答1:

if(c==0) //如果n正好分成b对,没剩余项,就直接输出(d[]/m)
{
for(i=1;i<=b;i++) //比如输入4 2.此初b=2
for(j=2*1-1;j<=2*i;j++) //////这个循环有问题,d[i]=a[i*m-m+1]+....+a[i*m], d[i]=a[2*i-1]+a[2*i]; //i=1时,d[1]=a[1]+a[2]...i=2时,d[2]=a[3]+a[4]

这段帮你改的:(下面c!=0的类似)
if(c==0) //如果n正好分成b对,没剩余项,就直接输出(d[]/m)
{
for(i=1;i<=b;i++)
{
d[i]=0; //比如输入4 2.此初b=2
for(j=m*(i-1)+1;j<=m*i;j++)
d[i]+=a[j];
} //i=1时,d[1]=a[1]+a[2]...i=2时,d[2]=a[3]+a[4]

主要就是分段求和有问题,你再整理下思路吧,下面是完整的:
#include
int main()
{
int m,n,i;
int a[100]; //存2,4,6,8……
int d[100]; //m项a[]并成一项
int b,c,j;
while(scanf("%d%d",&n,&m)!=EOF)//3 2
{
for(i=1;i<=n;i++)//
a[i]=2*i; //存2,4,6,8……
b=n/m; //b为共几组m
c=n%m; //c为剩余的个数

if(c==0) //如果n正好分成b对,没剩余项,就直接输出(d[]/m)
{
for(i=1;i<=b;i++)
{
d[i]=0; //比如输入4 2.此初b=2
for(j=m*(i-1)+1;j<=m*i;j++)
d[i]+=a[j];
} //i=1时,d[1]=a[1]+a[2]...i=2时,d[2]=a[3]+a[4]
for(i=1;i<=b;i++)
{
if(i else if(i==b) printf("%d\n",d[i]/m); //输出
}
}
else //c!=0,说明分成b组后,还剩下c个数不成一组
{
d[100]=0; //用d[100]项存入剩下的c个数的和
for(i=1;i<=b;i++)
{
d[i]=0;
for(j=m*(i-1)+1;j<=m*i;j++)
{
//d[i]=a[2*i-1]+a[2*i];
d[i]+=a[j];
// printf("%d ",d[i]/m); //这段和上面一样,是输出成对的平均值
}
printf("%d ",d[i]/m);
}
for(i=m*b+1;i<=m*b+c;i++) //m*b+1是不成对的第一个值,m*b+c是不成对的总数
{
d[100]=d[100]+a[i];
//把不成对的和赋给d[100]项,输出平均值
}
printf("%d\n",d[100]/c);
}
}
return 0;
}

回答2:

无需用数组,以下是一个AC的程序:

//---------------------------------------------------------------------------

#include
void fun(int *a,int m) //输出从*a开始的m个整数的平均数
{
int i,s=0;
for (i = 0; i s+=*a;
}
printf("%g",s/(double)m);
}
void ave(int n,int m) //输出n个整数列每m个整数的平均数
{
int a=2;
while (n>=m)
{
fun(&a,m);
n-=m;

putchar(n?' ':'\n');
}
if (n) {
fun(&a,n);
putchar('\n');
}

}
int main(int argc, char* argv[])
{
int m,n;
while (scanf("%d%d",&n,&m)!=EOF)
ave(n,m);
return 0;
}
//---------------------------------------------------------------------------