/**
*写一个程序,对于一个64位正整数,输出它所有的连续自然数(两个以上)之和的算式
*
*实际上,假设N=a1+a2+a3+...+an
*则,N=(an+a1)*(an-a1+1)/2
*则,N*2=(an+a1)*(an-a1+1)
*设m=an+a1;n=an-a1+1
*则N*2=m*n,且a1=(m-n+1)/2,an=(m+n-1)/2
* */
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
using std::cout;
using std::endl;
void output(unsigned long long n)
{
cout<<n<<endl;
unsigned long long m=0;
unsigned long long nn=0;
for(unsigned long long i=2;i<std::sqrt(n*2);++i)
{
if((n*2)%i==0)
{
m=std::max(i,(n*2)/i);
nn=(m==i)?(n*2)/i:i;
if((m-nn+1)%2==0 && (m+nn-1)%2==0)
{
for(unsigned long long j=(m-nn+1)/2;;++j)
{
if(j==(m+nn-1)/2)
{
cout<<j;
break;
}
cout<<j<<"+";
}
cout<<endl;
}
}
}
}
int main(int argc,char* argv[])
{
if(argc==2)
output(std::atoll(argv[1]));
return 0;
}
将一个正整数分解为连续的自然数的和
最新推荐文章于 2023-07-29 16:15:31 发布