简体   繁体   中英

Find partial sum of 'X' numbers in array in c

can you help me with code which returns partial sum of 'X' numbers in array in c?

Complete :

    int arr_sum( int arr[], int n )//Recursive sum of array
     { 
      if (n < 0) //base case:
      {

        return arr[0];
      }
      else
      {
        return arr[n] + arr_sum(arr, n-1);
      }
    }
    void sum_till_last (int *ar,int si )
    {

        **int sum,i;// the problem some where here
        ar=(int*) malloc(si*sizeof(int));

        for (i=0; i<si;i++)
        {

            sum=arr_sum(ar,i);
            ar [i]=sum;
        }
        free (ar);**
    }


 void main ()
{
    int i;
    int a [5];
    for (i = 0; i < 5; i++)
      scanf_s("%d", &a[i]);

    sum_till_last(a,5);
    printf("%d\n",a[5]);
}

\\i want to create new array with this this legality: My input :

4 13 23 21 11

The output should be (without brackets or commas):

4 17 40 61 72

Now when we can see the full code, it's quite obvious that the problem is in the sum_till_last function where you overwrite the pointer you pass to the function with some new and uninitialized memory you allocate.

Drop the allocation (and the call to free of course). And fix the logical bug in arr_sum that causes you to get arr[0] + arr[0] when i is zero.

Here you go:

#include <stdio.h>

int main () {
   int in_arr[5] = {4,13,23,21,11};
   int out_arr[5];
   int p_sum =0;
   int i;

   for ( i=0;i<5;i++){
      out_arr[i] = in_arr[i]+p_sum;
      p_sum=p_sum+in_arr[i];
   }

   for (i=0;i<5;i++){
      printf("%d", out_arr[i] );
   }  
}

I just made it simple so it´s easy to understand :) I´m assuming "n" is always equal or less then array element number. Then you just print the SUM.

  #include  <stdio.h>

     int arr_sum( int arr[], int n ){
         int i=0,SUM=0;   
         for(; i < n;i++){
           SUM= SUM+ arr[i];
           printf("%d ",SUM);
         }  
    }

     int main(void) {
         int array[] = {4, 13, 23, 21, 11};
         arr_sum(array,5);
         return 0;
     }

Fix according to your policy

#include <stdio.h>
#include <stdlib.h>

int arr_sum(int arr[], int n){
    if (n == 0){//Change to this
        return arr[0];
    } else {
        return arr[n] + arr_sum(arr, n-1);
    }
}

void sum_till_last(int *ar, int si){
    int sum,i;
    int *temp = malloc(si * sizeof(int));//variable name ar is shadowing parameter name ar.

    for(i = 0; i < si; i++){
        temp[i] = arr_sum(ar, i);
        if(i)
            putchar(' ');
        printf("%d", temp[i]);//need print out :D
    }
    free(temp);
}

int main(void){
    int i, a[5];

    for (i = 0; i < 5; i++)
        scanf_s("%d", &a[i]);

    sum_till_last(a, 5);
    //printf("%d\n",a[5]);<-- this print only one element. and It's out of bounds element XD 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM