找到C中递增顺序的最大子数组的元素总和?

时间:2014-03-02 13:29:09

标签: c arrays file

我有一个名为sample.txt的文件,其中包含1000个整数(正数和负数)。首先,我将文件复制到大小为1000的数组中(例如 a )。 我的目标是在 a 中找到最大的子数组,并找到其中的元素总和。 如果连续元素的递增顺序,则数组是子数组。例如,在数组{12,23,3,1,-56,2,4,6,45,49,1,2,-10}中,子数组是{-56,2 ,4,6,45,49}。 然后我需要计算这个子数组的元素总和。

以下是我尝试使用C程序解决问题。 我是一名非CS专业的学生,​​在本学期刚刚完成了C编程。非常感谢您的帮助。

int sum(int a[],int i,int temp)
{
 int sum=0,j;
 for(j=i;j<i+temp;j++)
  sum+=a[j];
 printf("Sum = %d", sum); 
 return 0;
}

int main()
{
    FILE *f1;
    int a[1000],b[900];
    int number,i=-1,counter=0,temp=1,check=1,j;
    f1 = fopen("sample.txt","r");
    while (!feof (f1) && fscanf (f1, "%d", &number) && i++ < 1000 )// copying the file to an array
    a[i] = number;
    fclose(f1);
    for(i=1;i<1000;i++)
    {
     if(a[i-1]<a[i])
      counter++;
     else
     {
       if(counter>temp)
         temp=counter;
       counter=0;
      } 
    }
    temp++;
    printf("Temp= %d", temp); // the length of the largest sub array whose elements are in increasing order
    sum(a,i,temp);      
    return 0;
}   

4 个答案:

答案 0 :(得分:1)

只是一般性建议,以防止您的程序崩溃:

改变这个:

while (!feof (f1) && fscanf (f1, "%d", &number) && i++ < 1000 )
    a[i] = number;

对此:

while (!feof (f1) && fscanf (f1, "%d", &number) && i < 1000 )
    a[i++] = number;

答案 1 :(得分:0)

好吧,我来自C ++,但也许我可以帮忙..你可以试试这个:

for(i=1;i<=1000;i++)
    {
     if(a[i]<a[i+1])
      counter++;

答案 2 :(得分:0)

我引入了一个新变量temp_index,它将保存最大子数组的起始索引,并使用j在循环中存储起始索引。

试试这个

 if(a[i-1]<a[i])
 { 
  if (counter == 0) { j = i }
  counter++;
 }
 else
 {
   if(counter>temp) {
     temp_index = j;
     temp=counter;
   }
   counter=0;
  } 
}
temp++;
printf("Temp= %d", temp); // the length of the largest sub array whose elements are in increasing order
sum(a,temp_index,temp)

答案 3 :(得分:0)

  

a

中找到最大的子数组

“找到最大的”,我想你的意思是最长的子阵列。

无论如何,这是一个实现(它适用于您的测试输入):

int longest_increasing(int array[], int length, int *start, int *end)
{
    int pos, curr_pos;

    *start = 1;
    *end = 0;

    curr_pos = 0;
    while (curr_pos + 1 < length) {
        while (curr_pos+1 < length && array[curr_pos] >= array[curr_pos+1])
            curr_pos++;

        for (pos = curr_pos; pos+1 < length && array[pos] < array[pos+1]; pos++)
            ;

        if (*end - *start < pos - curr_pos) {
            *start = curr_pos;
            *end = pos;
        }
        curr_pos = pos+1;
    }

    if (*start < *end)
        return 1;
    else
        return 0;
}