将等差序列改一改就行:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int Sum, aFirst;
int i,j;
int w,k,m;
signed main()
{
// 等差数列求和公式 Sum = n*aFirst + n*(n-2)/2;
// Sum 为要拆分的整数,
// n 为拆分后连续自然数个数
// aFirst 为连续自然数中的第一位数
printf("请输入要分解的自然数Sum:\n");
scanf("%d",&Sum);
cout<<endl;
for(i = 1; i <= Sum/2; i++) //由于是连续自然数,所以首项必定不可能大于n/2
{
aFirst = i;
w = (2*aFirst-1) * (2*aFirst-1) + 8*Sum;
k = (int)sqrt(w);
m = k - 2*aFirst + 1;
if(k*k != w) // k是一个平方数
continue;
else if(m %2 !=0) // m必须为偶数
continue;
else
{
printf("可以分解%d个连续自然数:",m/2);
for(j=1;j<=m/2;j++)
printf("%d ",i+j-1);
cout<<endl<<endl;
}
}
return 0;
}
已测,可过。