高斯公式
题目详情:
高斯在上小学时发明了等差数列求和公式: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 ",count+1,x,(int)s); count++; }else{ printf("%d,%lf不整除! ",x,s); } }else{ printf("最多不超过%d个数相加! ",x); break; } } printf("result:%d ",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 ",count,x-1,(int)s); } s=(double)n/x+(1-x)/2.0; } printf("%d ",count); // break; } return 0; }
注意:程序中数据类型为 int 对照较大的数据计算过程中可能会溢出
CSDN挑战编程交流群:372863405