2 topxjl topxjl 于 2016.01.22 11:08 提问

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个测试可改为20

for  (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);
}

6个回答

q3733353520
q3733353520   2016.01.22 11:37
 #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);
}

iamlaosong
iamlaosong   2016.01.22 16:03

其实算法很简单,只要判断当前数字和前一个数字的求和结果,如果符号一致,则相加,否则,从头开始:
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);

}

iamlaosong
iamlaosong   2016.01.22 16:04

其实算法很简单,只要判断当前数字和前一个数字的求和结果,如果符号一致,则相加,否则,从头开始:
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);

}

iamlaosong
iamlaosong   2016.01.22 16:11

其实算法很简单,只要判断当前数字和前一个数字的求和结果,如果符号一致,则相加,否则,从头开始:

#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);

}

John_ToStr
John_ToStr   Rxr 2016.01.23 16:17

分情况累加,负数整数分别累加

91program
91program   Ds   Rxr 2016.01.22 11:28

看看下面的函数满足不满足你的要求:

 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("\r\n");
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!