/*--------------------------------------------------+
|____이미 찾은 합을 이용하여 앞 뒤 수만 연산________|
+---------------------------------------------------*/
#include <stdio.h>
int main()
{
unsigned __int64 start = 1, end, num;
unsigned __int64 i, sum = 0, ruler = 2;
printf("합은 : ");
scanf("%d", &num);
end = num;
while (ruler <= num) {
if (num / ruler == 1 && num % ruler == 0) {
printf("연속수가 없습니다.\n");
return 0;
}
ruler <<= 1; // ruler *= 2;
} // 2의 누승은 연속수가 없음
end = num / 2; // 마지막 값
if (num % 2) end++; // 홀수면 +1
for (start = end; sum < num; start--) sum += start;
start++; // 하나가 더 작아진 조건에서 탈출했으므로 복귀
while (start > 0) {
if (sum == num) {
printf("%lld ~ %lld, %lld장\n", start, end, end - start + 1);
sum -= end; // 다음을 위해 좌로 전진 하려면 마지막을 빼줌
end--; // 좌로 전진
// return 0; // 하나만 찾고 종료하려면
}
else if (sum > num) sum -= end--;
else if (sum < num) sum += --start;
}
return 0;
}