Sの連続正数シーケンス

2438 ワード

何海涛:『剣指Offer:名企業面接官精講典型プログラミング問題』:九度OJ
タイトルの説明:http://ac.jobdu.com/problem.php?cid=1039&pid=24
明ちゃんは数学が大好きで、ある日彼は数学の宿題をしているとき、9~16の和を計算するように要求して、彼はすぐに正解が100だと書いた.しかし、彼はこれに満足していない.彼はいったい何種類の連続的な正数シーケンスの和が100(少なくとも2つの数を含む)であるかを考えている.間もなく、彼は別の連続正数と100のシーケンスを得た:18,19,20,21,22.今問題をあなたに任せて、あなたもすぐにすべてとSの連続正数のシーケンスを見つけることができますか?Good Luck!
入力:
複数セットのデータを入力します.
各データ群は、1個の整数Sのみを含む(S<=1000000).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:
#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!
"); printf("#
"); 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
", high); sum -= low; low++; } } if( !flag ) { printf("Pity!
"); } printf("#
"); } return 0; }