c语言-C语言高手请进:这个分块求和C语言程序问题出在哪里??对一组无规律数据按正数、负数和零分块求和,

问题描述

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

解决方案

 #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");
}
时间: 2024-08-30 13:53:45

c语言-C语言高手请进:这个分块求和C语言程序问题出在哪里??对一组无规律数据按正数、负数和零分块求和,的相关文章

贝叶斯+mahout-朴素贝叶斯分类问题 高手请进

问题描述 朴素贝叶斯分类问题 高手请进 网上资料讲mahout 贝叶斯的很多,都是讲准备数据,划分测试集训练集,测试训练样本...但是,之后呢?有了这个测试很好的模型,怎么对其他的数据分类啊?比如我通过mahout进行朴素贝叶斯分类,得到训练集,测试也很好,那么有了这个训练集之后怎么对其他数据进行分类呢.说的越详细越好. 解决方案 运行mahout的朴素贝叶斯分类器 1.准备数据1.1 下载数据集,并解压 wget http://people.csail.mit.edu/jrennie/20Ne

php curl采集高手请进

问题描述 php curl采集高手请进 http://www.lecai.com/ 这个网站怎么用php/url技术进行模拟登录?求参考程序..... 解决方案 我大致看了一下,个人习惯使用Snoopy.class.php模拟登陆,觉得不好可以忽略 POST http://www.lecai.com/user/ajax_login.php HTTP/1.1Host: www.lecai.comUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:3

微积分-vc 数字图像处理高手请进!

问题描述 vc 数字图像处理高手请进! 图像的梯度锐化 看到上面的公式,我叫一个晕,请问这是哪里才能学到呀?什么意思呀?还需要学习微积分吗? 解决方案 这个公式你仔细琢磨就懂了,第一个实际上是数字的差分,求得是点(i,j)的x和y方向的微分值的和,这里理解为这个像素点的梯度值.第二个就是锐化的过程,当梯度值大于某个阈值时,锐化的结果即此点的梯度值,若梯度小于那个阈值,则锐化的结果是原像素的值. 像这类比较基础的图像处理方法,建议你看一下清华大学章毓名教授写的<图像工程>. 解决方案二: 数字图

apt-ubuntu 高手请进,yara not found

问题描述 ubuntu 高手请进,yara not found 用apt-get intstall yara后,还是出现了configure: error: yara not found 请问为什么会这样,好烦啊,在线求高手解答 解决方案 spt-get install 是安装命令, 如果系统没有找到 yara 的安装包,就会这样. 查查 ubuntu 的在线安装配置. 解决方案二: 一个是看是否安装成功,其次看安装的yara能否执行,有没有错误.

高分悬赏 请大神指导-VBA高手请进 懂得webbrowser

问题描述 VBA高手请进 懂得webbrowser 请问如何通过VBA能够获取网页弹出窗体的Docuement对象,我是要操作弹出窗体里面的一线控件完成自动复制! 我现在可以获取到主页面的Document对象.

hbm-Hibernate 帅哥高手请进...关于Hibernate的三表关联,在线等...

问题描述 Hibernate 帅哥高手请进...关于Hibernate的三表关联,在线等... 表1: File (FID,Fname) 表2: UserGroup(GID,Gname) 表3: ActionPermissions(PID,Pname) 表4: File_Group_Permissions(ID,FID,GID,PID) 用四个表完成给某个文件指定用户组每个用户组指定权限,一文件对应多个用户组 每个用户组针对这个文件有不同的操作权限.Hibernate应该如何配置,表结构是否合理

vb参数传递-VB高手请进!在线等。。——shell使用dos命令时参数的传递

问题描述 VB高手请进!在线等..--shell使用dos命令时参数的传递 怎样才能将%LOGPATH%所替代的内容传递到其中? (不要写成调用bat的形式) 解决方案 不行的,%logpath%不能包在括号里,应该这样 Shell "cmd /k mkdir "+LOGPATH+" > nul 2>&1", vbNormalNoFocus vb调用dos是直接运行引号内的,而不给某一变量赋值.另外包在百分号内的是bat变量而不是vb的变量 解决

多线程-高手请进!!!---线程安全问题,怎么解决new String 问题

问题描述 高手请进!!!---线程安全问题,怎么解决new String 问题 场景是:一个订单号只能一个在付款,只能一个线程处理,不同的订单号支持并发处理 现在如果是new String("20140719140818");就有问题怎么解决 如果不是new出来的,什么情况会出现问题 public class Test { public static void main(String[] args) { new Thread(){ public void run(){ pay(&quo

变换-fftw使用的问题 频域抽取失败 高手请进~

问题描述 fftw使用的问题 频域抽取失败 高手请进~ int FFTw_IFFTw_Fun2(IN dDataArray* pRRIData, IN float fmin, IN float fmax, OUT dDataArray& VLFData) { try { int nSamples = pRRIData->m_nSamples; int N = pRRIData->m_nLen; int Nout = floor(N/2)+1;//实数据的DFT具有 Hermitian对