九度oj 和为S的连续正数序列 1354 (机智DP) 好题

题目1354:和为S的连续正数序列

时间限制:2 秒

内存限制:32 兆

特殊判题:

提交:2003

解决:618

题目描述:

小明很喜欢数学,有一天他在做数学作业时,要求计算出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
#
//AC代码。。
#include <stdio.h>
int main()
{
    int low, high,flag;
    int sum, k;
    while( scanf("%d",&k) != EOF )
	{
        if( k<0 ) 
			break;
        low=1;  high=2;  flag=0; sum=3;
        while( low<high )
		{
            if( sum==k )
			{
                flag = 1;
                for( int i=low; i<=high; i++)
				{
                    printf("%d",i);
                    if( i==high ) 
						printf("\n");
                    else 
						printf(" ");
                }
                high++;
                sum+=high;
            }
			else if( sum>k )
			{
                sum -=low;
                low++;
            }
			else
			{
                high++;
                sum +=high;
            }
        }
        if( !flag ) 
			printf("Pity!\n");
        printf("#\n");
    }
    return 0;
}

//下面的是我写的,TML代码。唉,还是太年轻。技术不行。
#include<stdio.h>
#include<string.h>
#include<math.h>
int a[5000];
int b[5000];
int main()
{
	int n,m,i,j,sum;
	while(scanf("%d",&n)&&n>=0)
	{
		int k=0;
		for(i=1;i<=n/2;i++)
		{
			for(j=i+1;j<=(n+1)/2;j++)
			{
				if((i+j)*(j-i+1)==n*2)
				{
					a[k]=i;
					b[k++]=j;
					break;
				}
			}
		}
		if(k==0)
			printf("Pity!\n");
		else
		{
			for(i=0;i<k;i++)
			{
				for(j=a[i];j<b[i];j++)
					printf("%d ",j);
				printf("%d\n",b[i]);
			}
		}
		printf("#\n");
	}
	return 0;
}
//这个更机智。80Ms
#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n>=0)
    {
        bool flag=true;
        int tmp=sqrt(2.0*n)+1;
        for(int i=tmp;i>=2;i--)
        {
            if(2*n%i==0)
            {
                int x=2*n/i+1-i;
                if(x%2==0&&x>0)
                {
                    flag=false;
                    x=x/2;
                    printf("%d",x);
                    for(int j=1;j<i;j++)
                        printf(" %d",x+j);
                    printf("\n");
                }
            }
        }
        if(flag)
            printf("Pity!\n");
        printf("#\n");
    }
    return 0;
}


你可能感兴趣的:(九度oj 和为S的连续正数序列 1354 (机智DP) 好题)