XTU (湘潭大学) 2011 新生练习赛(第一场)/ Problem A 连续自然数和

返回目录

 

题目大意:给定整数M(10 <= M <= 2,000,000),要求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M。

(e.g. 1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。)

输出 数段的 端点 即可。若有多个解,按升序输出。

 

题目类型:基础模拟题

 

题目分析:纯暴力肯定超时的,注意到 上面例子中10000 = 2000*5. 而1998 = 2000-5/2, 2002 = 2000+5/2。所以稍作分析就可以得到结论。

 

代码:

 

 #include<cstdio> #include<cstring> #include<cmath> using namespace std; int m; void f() { int a, b; int t = 1+(int)sqrt((double)1+2*m); //上界 for(int i=t; i>=2; i--) //至少2个数 //if(m/i +1 >= i/2) { //逆序枚举,先输出小的。 if(i%2) //分成奇数个 { if(m%i == 0) { a = m/i - i/2; b = m/i +i/2; printf("%d %d/n", a, b); } } else //分成偶个 { if((double)m/i == m/i+0.5) { a = m/i - i/2+1; b = m/i + i/2; printf("%d %d/n", a, b); } } } } int main() { int num=1; while(scanf("%d", &m) != EOF) { printf("Case %d:/n", num++); f(); } }

你可能感兴趣的:(XTU (湘潭大学) 2011 新生练习赛(第一场)/ Problem A 连续自然数和)