题目1354:和为S的连续正数序列 时间限制:2 秒内存限制:32 兆特殊判题:否提交:1685解决:511 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出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 #
#include <iostream> #include<stdio.h> using namespace std; void printContinueSequence(int small,int big){ for(int i=small;i<big;i++){ printf("%d ",i); } printf("%d\n",big); } bool findContinueSequence(int sum){ bool found = false; if(sum<3){ return found; } int small = 1; int big = 2; int middle = (1+sum)/2; int curSum = small+big; while(small<middle){ if(curSum==sum){ found = true; printContinueSequence(small,big); } while(curSum>sum&&small<middle){ curSum-=small; small++; if(curSum==sum){ found = true; printContinueSequence(small,big); } } big++; curSum+=big; } return found; } int main() { int n; while(scanf("%d",&n)!=EOF&&n>=0){ if(!findContinueSequence(n)){ printf("Pity!\n"); } printf("#\n"); } return 0; }
时间: 2024-10-11 09:00:54