oral_quiz->#和为定值的连续序列#

#include <stdio.h>

void PrintContinuesSequence(int start, int end);
void MyFindContinuousSequence(int sum) {
	if(sum < 3)
		return;

	int biggest = (sum+1) >> 1;
	int count = 2;
	while(count <= biggest) {
		//count = odd
		if((count & 0x1) && (sum%count == 0)) {
			int middle = sum/count, start = middle-((count-1) >> 1), end = middle+((count-1) >> 1);
			if(start <= 0)
				break;
			PrintContinuesSequence(start, end);
			++count;
		}
		//count = even
		else if(!(count & 0x1) && (sum%(sum/count+sum/count+1) == 0)) {
			int middle = sum/count, start = middle-((count-1) >> 1), end = middle+1+((count-1) >> 1);
			if(start <= 0)
				break;
			PrintContinuesSequence(start, end);
			++count;
		}
		else
			++count;
	}
}

void PrintContinuesSequence(int start, int end) {
	for(int i=start; i<=end; ++i)
		printf("%d ", i);
	printf("\n");
}

//=================hht's(这边真不推荐用hht的,面对大数时效率实在太低)==============================
void FindContinuousSequence(int sum) {
	if(sum < 3)
		return;

	int small = 1, big = 2, middle = (sum+1) >> 1;
	int curSum = small + big;

	while(small < middle) {
		if(curSum == sum)
			PrintContinuesSequence(small, big);

		while(curSum > sum && small < middle) {
			curSum -= small;
			++small;

			if(curSum == sum)
				PrintContinuesSequence(small, big);
		}

		++big;
		curSum += big;
	}
}

void Test(char* testName, int sum)
{
    if(testName != NULL)
        printf("%s for %d begins: \n", testName, sum);

    MyFindContinuousSequence(sum);
}

int main(int argc, char* argv[])
{
    Test("test1", 1);
    Test("test2", 3);
    Test("test3", 4);
    Test("test4", 9);
    Test("test5", 15);
    Test("test6", 1786698798);

    return 0;
}



你可能感兴趣的:(连续序列,和为定值)