题目描述
78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。
输入一个正整数 n(<=10000)
输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+...+b=n。
对于多种表示法,a小的方案先输出。
样例输入
78
样例输出
1 12
18 21
25 27
解题思路
在数学中,连续整数和的公式为:sum=n*(n+1)/2,即首项加末项的和乘以项数除以2.我们可以根据求和的这一特质来解决这道题。定义两个变量i(首项)和j(末项),我们容易知道i,j均小于n/2;因此可以使用两个for循环,均从1开始,上界均为n/2;当(i+j)*(j-i+1)=2*n的时候即为满足条件,此时输出首项和末项。重复上述操作,直至循坏结束。
完整代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int i,j;
for(i=1;i<=n/2;i++)
{
for(j=1;j<=n;j++)
{
if((i+j)*(j-i+1)==2*n) //(j-i+1)为项数
{
cout<<i<<" "<<j<<endl;
}
}
}
return 0;
}