分解连续自然数的和_连续自然数和 (C语言代码)

/*

思路:m 分解成连续 n 个自然数相加,那么这 n 个数的平均数 m/n 应该是这些数中心的位置,或者

中心附近。那么第一个数就是 m/n- n/2,这个值要大于 0 。

==>>    2*m > n*n

==>>    n 

知道了 n 的值,就能知道第一项的值

用low 表示第一项

low = m/n-n/2;

考虑到整数除法,有可能除不尽的情况,low 有可能等于 m/n-n/2+1

最后一项的值 high = low +n-1

代码如下:

*/

#include 

#include 

int main(void){

long m;

while(EOF != scanf("%ld",&m)){

long low,high;

long n;

long nMax = (long)(1+sqrt((double)(m*2)));    //这里是为了处理强制转换损失的精度

for(n = nMax;n>=2;n--){

for(low = m/n-n/2;low<=m/n-n/2+1;low++){    //用循环来处理low可能出现的情况

if(2*m == low*2*n+n*(n-1)){    //这里是等差数列求和的一个变化

high = low + n-1;

printf("%ld %ld\n",low,high);

break;        //一个n值,对应一个low,所以一旦求出,就跳出循环了

}

}

}

printf("\n");

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值