2013年1月30日 星期三

[C Programming] 等值首尾和

假設有一個陣列x[],當中有n個元素,每個皆大於0,
定義x[0]+x[1]...+x[i]為前段和(所以前段和有n種),
x[j]+x[j+1]...+x[n-1]為後段和(所以後段和也有n種)。
請寫一個程式,求出x[]中有多少組相同的前段和和後段和。

解:
其實也跟前面的題目大同小異。
讓兩個index分別從前後段開始,若前段和比後段和大,
則後段再多取一個值,反之亦然。
遇到相等的時候增加count,最後回傳即達到要求。
為了程式方便起見,一開始的起點是prefix=0,suffix=n-1,
按照程式跑法,第一次就會增加count,
但由於最後一次會剛好先跳出迴圈,所以一來一往恰巧互補了。

Code大概長這樣:
int headtail(int f[], int n)
{
 int pre = 0, suf = n-1, presum = 0, sufsum = 0, count = 0;
 while( pre < n && suf >= 0)
  if(presum > sufsum)
   sufsum += f[suf--];
  else if(sufsum > presum)
   presum += f[pre++];
  else
  {
   count++;
   sufsum += f[suf--];
   presum += f[pre++];
  }
 return count;
}

沒有留言:

張貼留言