题目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代码。。
-
//下面的是我写的,TML代码。唉,还是太年轻。技术不行。#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; }
-
//这个更机智。80Ms#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; }
-
#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; }