高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050。现在问题在于给你一个正整数n,问你他可以表示为多少种连续正整数之和?(自身也算)。
输入格式:
多组数据,每组数据一行,一个正整数n。 0<n<2000000000
输出格式:
每组数据一行,包含一个正整数,表示结果。
输入样例
5
120
输出样例:
2
4
解释:
5=2+3=5
120=1+2+...+15=22+23+24+25+26=39+40+41=120
初稿代码:
/* 3: 3、1+2=3 4: 4、 5: 5、2+3=5 6: 6、1+2+3=6 7: 7、3+4=7 8: 8、 9: 9、4+5=9、2+3+4=9 10: 10、1+2+3+4=10 分析: 输入n 设 s,x (x个从s开始连续的数相加等于n,例如 :10=1+2+3+4中 n:10 s:1 x=4) 于是有求和公式: (s+(s+x-1)) ----------- * x = n 2 根据求和公式暴力即可求解 */ #include "stdio.h" #include "math.h" int main() { int count; long long x,n; while(scanf("%I64d",&n)!=EOF) { count=1; for(x=2;x<n;x++){ double s=(n+(x-x*x)/2.0)/x; if(s>=1){ if(floor(s+0.5)==s){ //判断 s 为整数 printf("%d > x:%I64d s:%d\n",count+1,x,(int)s); count++; }else{ printf("%d,%lf不整除!\n",x,s); } }else{ printf("最多不超过%d个数相加!\n",x); break; } } printf("result:%d\n",count); break; } return 0; }
AC后代码:
#include "stdio.h" #include "math.h" int main() { int count; long long x,n; while(scanf("%I64d",&n)!=EOF) { double s=n; for(count=0,x=2;s>=1;x++){ if(floor(s+0.5)==s) { count++; // printf("%d > x:%d s:%d\n",count,x-1,(int)s); } s=(double)n/x+(1-x)/2.0; } printf("%d\n",count); // break; } return 0; }
CSDN挑战编程交流群:372863405
CSDN编程挑战——《高斯公式》,码迷,mamicode.com
原文地址:http://blog.csdn.net/user_longling/article/details/24582085