和爲指定值的連續序列

輸入一個整數s,打印出所有和爲s的連續正整數序列(至少包含兩個數)。例如,對於輸入15,由於有1+2+3+4+5=15,4+5+6=15,7+8=15,所以打印出1~5、4~6、7~8三個序列。


有個比較好的做法是利用等差數列求和公式:s=a*n+n*(n-1)/2。這裏的a是第一個元素,n是項數。


int solve(int k)
{
	int count = 0;
	for (int i = 1, v = 0; (v = i * (i - 1) / 2) <= k; i++) {
		if ((k - v) % i == 0) {
			// a = (k - v) / i;
			count++;
		}
	}
	return count;
}

這種方法只適用於這個特定的應用場景,題目稍微改變一下就不太好處理了。例如,要求求得的序列是某個數值中的連續序列,不再是自然數連續序列,這樣就沒辦法用這個方法了。這種情況下可以先將數組排序,然後按照下面的方法求解即可。


int solve(int A[], int N, int val)
{
	int count = 0, beg = 1, end = 0, sum = A[0];
	while (beg < end && end < N) {
		if (sum == val) {
			count++;
			// A[beg] -> A[end]
			sum += A[++end];
		} else if (sum < val) {
			sum += A[++end];
		} else {
			sum -= A[beg++];
		}
	}
	return count;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章