高斯公式
题目详情:
高斯在上小学时发明了等差数列求和公式: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=34: 4、5: 5、2+3=56: 6、1+2+3=6 7: 7、3+4=7 8: 8、9: 9、4+5=9、2+3+4=910: 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 = n2 根据求和公式暴力即可求解
*/
#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;
}
注意:程序中数据类型为 int 对比较大的数据计算过程中可能会溢出
CSDN挑战编程交流群:372863405