高斯公式
題目詳情:
高斯在上小學時發明了等差數列求和公式: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?????????????????