CSDN编程挑战——《高斯公式》

时间:2024-01-19 11:56:50

高斯公式

题目详情:

高斯在上小学时发明了等差数列求和公式: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;
}

注意:程序中数据类型为 int 对照较大的数据计算过程中可能会溢出

CSDN挑战编程交流群:372863405