问题描述
- C语言高手请进:这个分块求和C语言程序问题出在哪里??对一组无规律数据按正数、负数和零分块求和,
-
对一组无规律数据按正数、负数和零分块求和,即要求将序列中相邻的正数、零及负数分块累加输出,格式要求:
源数据: 2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,...(共100个)
整理输出为: 2,5,13,19,0,0,-2,-3,-7,0,5,11,18,-5,-7...(共100个)
以下程序哪里出了问题?我搞了2星期,总是得不到完整输出:
int main()
{
int p,z,n,limit; //定义变量p,z,n分别计数正数、零、负数及源数据总个数
p=z=n=0;
limit=100; //源数据100个,测试程序时可改为20
int i;int source[100]=[2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,...]; //源数据100个测试可改为20
int target[100]; //target数组用于输出结果,100个测试可改为20for (i=1; i<=limit; i++) { if (source[i]>0) //如果源数据第1个数是正数 { target[i]=source[i]; //最左第1个正数赋值给目标数组,准备累加正数 z=1; //正数计数为1个 for (i=1+1; i<=limit; i++) //正数累加循环:从最左第2个开始判断 { if (source[i]<=0) break; //如果第2个不是正数,退出循环 target[i]=target[i-1]+source[i] //将左边正数累加到当前目标数组; r++; //正数计数增加1 } } //循环完成,完成一组连续正数的累计求和,正数数量为z个 limit=limit-r; //经过正数求和,剩余待处理数据共limit-r个
//连续零值求和
if (source[i]==0) //如果第1个数是0 { target[i]=source[i]=0; //赋值,准备累加零值; z=1; //零值计数1个 for (i=1+1; i<=limit; i++) //累加循环:从最左第2个开始判断 { if (source[i]!=0) break; //如果第2个不是零,退出循环 target[i]=target[i-1]+source[i] //累加; z++; //零值计数增加1 } } //循环完成,完成一组连续零值的累计求和,零值数量为z个 limit=limit-r-z; //经过正数及零值求和,剩余待处理数据共limit-p-z个
// 连续负数求和
if (source[i]>0) //如果源数据第一个数是负数
{
target[i]=source[i]; //赋值,准备累加负数
n=1; //负数计数为1个
for (i=1+1; i<=limit; i++) //负数累加循环:从最左第2个开始判断
{
if (source[i]>=0) break; //如果第2个不是负数,退出循环
target[i]=target[i-1]+source[i] //累加;
n++; //负数计数增加1
}
} //循环完成,完成一组连续负数的累计求和,负数数量为n个limit=limit-p-z-n; //经过正数、零值及负数求和,剩余待处理数据共limit-p-z-n个 }
//++以下输出目标数组++++++++++++++++
int j;
for (j=1,j<=100, j++)
printf("%d ", target[j]);return(0);
}
解决方案
#include <stdio.h>
int main()
{
int i,j;
int source[20]={2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,-4,0,0,4,6};
int target[20]={0};
int flag[20]={0};
for(i=0; i<20; i++)
{
if(source[i] > 0)
flag[i] = 0;
else if(source[i] == 0)
flag[i] = 1;
else
flag[i] = 2;
}
target[0]=source[0];
for(i=1; i< 20; i++)
{
target[i]=source[i];
for(j=i-1; j >= 0; j--)
{
if(flag[j] == flag[i])
target[i] += source[j];
else
break;
}
}
for(i=0; i< 20; i++)
{
printf("%d ", source[i]);
}
putchar(10);
for(i=0; i< 20; i++)
{
printf("%d ", target[i]);
}
putchar(10);
}
解决方案二:
其实算法很简单,只要判断当前数字和前一个数字的求和结果,如果符号一致,则相加,否则,从头开始:
int main()
{
int i,j;
int source[20]={2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,-4,0,0,4,6};
int target[20]={0};
int flag[20]={0};
target[0]=source[0];
for(i=1; i<20; i++)
{
if(source[i] > 0)
{
if target[i-1]>0
target[i] = target[i-1]+source[i];
else
target[i] = source[i];
}
else if(source[i] < 0)
{
if target[i-1]<0
target[i] = target[i-1]+source[i];
else
target[i] = source[i];
}
else
target[i] = source[i];
}
for(i=0; i< 20; i++)
{
printf("%d ", target[i]);
}
putchar(10);
}
解决方案三:
其实算法很简单,只要判断当前数字和前一个数字的求和结果,如果符号一致,则相加,否则,从头开始:
int main()
{
int i,j;
int source[20]={2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,-4,0,0,4,6};
int target[20]={0};
int flag[20]={0};
target[0]=source[0];
for(i=1; i<20; i++)
{
if(source[i] > 0)
{
if target[i-1]>0
target[i] = target[i-1]+source[i];
else
target[i] = source[i];
}
else if(source[i] < 0)
{
if target[i-1]<0
target[i] = target[i-1]+source[i];
else
target[i] = source[i];
}
else
target[i] = source[i];
}
for(i=0; i< 20; i++)
{
printf("%d ", target[i]);
}
putchar(10);
}
解决方案四:
其实算法很简单,只要判断当前数字和前一个数字的求和结果,如果符号一致,则相加,否则,从头开始:
#include
int main()
{
int i,j;
int source[20]={2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2,-4,0,0,4,6};
int target[20]={0};
int flag[20]={0};
target[0]=source[0];
for(i=1; i<20; i++)
{
if(source[i] > 0 && target[i-1]>0) || (source[i] < 0 && target[i-1] < 0)
target[i] = target[i-1]+source[i];
else
target[i] = source[i];
}
for(i=0; i< 20; i++)
{
printf("%d ", target[i]);
}
putchar(10);
}
解决方案五:
分情况累加,负数整数分别累加
解决方案六:
看看下面的函数满足不满足你的要求:
void Test(void)
{
int iSrc[] = {2,3,8,6,0,0,-2,-1,-4,0,5,6,7,-5,-2};
int i = 0;
int iSize = sizeof(iSrc) / sizeof(iSrc[0]);
for(i = 0;i < iSize - 1;i++)
{
if(iSrc[i] > 0 && iSrc[i + 1] > 0)
{
iSrc[i + 1] += iSrc[i];
}
else if(iSrc[i] < 0 && iSrc[i + 1] < 0)
{
iSrc[i + 1] += iSrc[i];
}
}
for(i = 0;i < iSize;i++)
{
TRACE("%d ",iSrc[i]);
}
TRACE("rn");
}