1. 程式人生 > >洛谷P1147 連續自然數和(方法1 暴力列舉)

洛谷P1147 連續自然數和(方法1 暴力列舉)

題目描述 對一個給定的自然數 M,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為 M 。

例子: 1998+1999+2000+2001+2002 = 100001998+1999+2000+2001+2002=10000 ,所以從 19981998 到 20022002 的一個自然數段為 M=10000M=10000 的一個解。

輸入輸出格式 輸入格式:

包含一個整數的單獨一行給出M的值( 10 \le M \le 2,000,00010≤M≤2,000,000)

輸出格式:

每行兩個自然數,給出一個滿足條件的連續自然數段中的第一個數和最後一個數,兩數之間用一個空格隔開,所有輸出行的第一個按從小到大的升序排列,對於給定的輸入資料,保證至少有一個解。

輸入輸出樣例 輸入樣例#1: 複製 10000 輸出樣例#1: 複製 18 142 297 328 388 412 1998 2002

#include<cstdio>
using namespace std;
int main(){
    int M;
    int sum = 0;
    
    scanf("%d",&M);//輸入M 
    for(register int i=1;i<=M/2;i++){
        //暴力列舉 把1到M/2的例子全都舉出 
        sum = 0;
        int last;
        for(register int j=i;j<=M/2+1;j++){//第二層迴圈
		//然後第二層迴圈列舉接下來的數字,sum累加 
            last=j;
            sum+=j;
            if(sum>=M)break;//如果大於就退出
        }//小於的話就一直迴圈 
        if(sum==M)//如果等於就輸出
		printf("%d %d\n",i,last);//最後的輸出 
    } 
    
    return 0;
}
//時間複雜度為O(N^2)

//暴力列舉方法