思路:
设一段自然数的首项为a1,末项为a2,则这段自然数之和为:
sum =(a1 + a2) * (a2 - a1 + 1) / 2 = m
即(a1 + a2) * (a2 - a1 + 1) = 2m
可以把2M分解成两个数之积,假设分成了两个数K1,K2,且K1<K2时,
可以列一个二元一次方程组:
(1)a2 - a1 + 1 = K1
(2)a1 + a2 = K2
解得:a1 = ( K2 - K1 + 1 ) / 2 , a2 = ( K1 + K2 - 1 ) / 2
要保证a1和a2都为自然数,K2和K1必须是一个奇数,一个偶数
不过有一种特殊情况,就是a1 = a2的情况,这种情况是不允许的
即(K2-K1+1)/2 ≠ (K1+K2-1)/2,解得K1≠1
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
typedef long long ll;
using namespace std;
int m,k1,k2;
int main(){
scanf("%d",&m);
for(k1=sqrt(2*m);k1>1;k1--){
if(2*m%k1==0&&(k1+2*m/k1)%2==1){//如果k2为整数且k1,k2一奇一偶
//奇数+偶数的和必定是奇数
k2=2*m/k1;
int a1=(k2-k1+1)/2,a2=(k1+k2-1)/2;
printf("%d %d\n",a1,a2);
}
}
return 0;
}
来源:CSDN
作者:化身孤岛的鲸o
链接:https://blog.csdn.net/weixin_44123362/article/details/103907004