题意
求和为
m
m
m的连续自然数列,输出所有符合条件的数列的首项和末项
样例
输入
10000
输出
18 142
297 328
388 412
1998 2002
思路
直接暴力,首先先用一个i用来枚举首项
∵这个数列是一个等差数列求等差数列的和公式为=(首项加末项)*项数/2=和
∴(首项+末项)项数=m/2
∴i只需要枚举到m/2就可以了
然后循环里面再套一个循环(j),用来枚举每一项,然后用一个数一直加(就等于乘项数了),只要这个数超出或等于m,我们就可以退出了,最后再判断和是否等于m,若等于,直接可以输出首项和末项了
代码
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
freopen("combo.in","r",stdin);
freopen("combo.out","w",stdout);
int m; scanf("%d",&m);
for (int i = 1; i <= m/2; ++i) {
int sum = 0,j;
for (j = i; j < m; ++j)
{
sum += j;
if (sum >= m) break;
}
if (sum == m) printf("%d %d\n",i,j);
}
return 0;
}