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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c++实验五-计算一组数中正数和负数的和
一、问题及代码 /* * 文件名称:计算一组数中正数和负数的和 * 作 者:伍喜康 * 完成日期:2017 年 5月 5日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分: * 输入描述: * 问题描述: * 程序输出:正数和负数的和分别是 * 问题分析:注意和的初始值 * 算法设计:略 */ #includ
C语言实现从字符串中提取整数组(正负数整数和零),并计算整数组的和
前段时间准备各大互联网公司的唐勋2017春招,其中 腾讯和携程的编程题涉及到获取输入的字符,并提取字符中的整数,当然,博主那时候没写出来,主要是关于输入这方面不怎么研究,今天抽空写了这篇博文(可能是腾讯和携程的在对这类编程题的后台数据中对整数的定义为非负整数,这是博主自己的猜想)
从键盘输入10个整数求和,输入0结束
代码入下:#include<iostream> using namespace std; int main() { int n = 0;//输入变量 int sum = 0;//存放和的变量 cout << "请输入数,输入0结束!" << endl; cin >> n ; while (n != 0) { sum += n;
输入20个数,统计正数个数和负数个数,帮忙解决一下!
#includeusing namespace std;void main(){ int i,a=0,b=0,n=0,no[20],*ptr; do cin>>no[n]; while(++n); ptr=new int[20]; int sum(ptr,int i) {     int j=0;  while(j  {   if(*ptr>
正负数、0,个数的统计
8051单片机汇编程序请教。悬赏分:30设有40个有符号数,连续存放在400H为首地址的存储单元,试编程统计其中零,正数和负数的个数分别保存在R2,R3,R4中。;==========================================最佳答案:程序如下:    ORG  0H    MOV  A,  #00H    MOV  R2, A        MOV  R3, A    MO
分治法求和C语言-算法设计实验2
题目:用分治法求和  这里我们举出一个例子,利用分治法求数组的和:  比如: a[10] = {1,2,3,4,5,6,7,8,9,10} ,分治法的算法之前我们学数据结构的时候,有过应用,数据结构学过的归并排序,二分法,快速排序算法等里面用到的就是分治法的思想:  如图:  把一个大问题,分解成若干个小问题,这里把一个大的数组分解成若干个小数组,再合并把值返回。  下面看程
C语言练习0之数组——数组元素求和与数组冒泡排序(bubble sort)
今天复习了一下C语言的数组部分,练习了数组元素的求和与冒泡排序。
输入任意10个数求和
/* *Copyright (c)2013,烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:孙玲倩 *完成日期:2013年11月3日 *版本号:v1.0 *问题描述:输入任何10个数求和 */ #include using namespace std; int main()
C实现的分块读取较大文件
一个用C语言实现的分块读取文件程序,能有效的解决读取较大文件时间过久的问题
C语言实现分块查找的算法
 //文件名:exp9-3.cpp #include #define MAXL 100     //定义表中最多记录个数 #define MAXI 20      //定义索引表的最大长度 typedef int KeyType; typedef char InfoType[10]; typedef struct {  KeyType key;