題目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; }