題意
求和爲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;
}