小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck! 輸入: 輸入有多組數據。 每組數據僅包括1個整數S(S<=1,000,000)。如果S為負數時,則結束輸入。 輸出: 對應每組數據,若不存在和為S的連續正數序列,則輸出“Pity!”;否則,按照開始數字從小到大的順序,輸出所有和為S的連續正數序列。每組數據末尾以“#”號結束。 樣例輸入: 4 5 100 -1 樣例輸出: Pity! # 2 3 # 9 10 11 12 13 14 15 16 18 19 20 21 22 # 思想:兩個指針一起從前往後掃描!若大於S,則下邊界++,若小於S,則上邊界++( 邊界的意思是數列的上下界哦!不要弄錯~ ),相等則輸出一對,然後繼續!S/2,因為後面在掃描,兩個數相加就一定大於S了!( 一組序列至少兩個數哦~呵呵 ) 代碼AC: [cpp] #include <stdio.h> int main() { long int s, low, high, half, sum, i; int flag; while( scanf("%ld", &s) != EOF ) { if( s < 0 ) { break; } if( s < 3 ) { printf("Pity!\n"); printf("#\n"); continue; } low = 1; high = 2; sum = 3; half = s / 2; flag = 0; while( low <= half ) { if( sum > s ) { sum -= low; low++; } else if( sum < s ) { high++; sum += high; } else { flag = 1; for( i = low; i < high; i++ ) { printf("%d ", i); } printf("%d\n", high); sum -= low; low++; } } if( !flag ) { printf("Pity!\n"); } printf("#\n"); } return 0; }