codevs 1312 连续自然数和
1312 连续自然数和
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
对于一个自然数M,求出所有的连续的自然数段,使得这些连续自然数段的全部数字和为M.
eg:1998+1999+2000+2001+2002=10000,所以从1998到2002的一个自然数段为M=10000的一个解。
输入描述 Input Description
一个数M
输出描述 Output Description
每行两个数,为连续自然数段的一头一尾,所有输出行的第一个数按照升序排列
样例输入 Sample Input
10000
样例输出 Sample Output
18 142
297 328
388 412
1998 2002
数据范围及提示 Data Size & Hint
#include<iostream> #include<cstdio> using namespace std; int main() { int m,i,j,k; scanf("%d",&m); for(i=m;i>=2;i--)//i枚举是多少连续个连续的数的和 { /* 设这i个连续的数第一个为x 则 这i个数为x x+1 x+2 ...... x+i-1 根据数学公式和为((x+x+i-1)*i)/2 令((x+x+i-1)*i)/2=m 可以算出x,再反过来验证和是不是等于m即可 */ int x=(2*m/i-i+1)/2; if((2*x+i-1)*i/2==m&&x>0) printf("%d %d\n",x,x+i-1); } return 0; }