連續整數的和——51nod 1138題

給出一個正整數N,將N寫爲若干個連續數字和的形式(長度 >= 2)。例如N = 15,可以寫爲1 + 2 + 3 + 4 + 5,也可以寫爲4 + 5 + 6,或7 + 8。如果不能寫爲若干個連續整數的和,則輸出No Solution。
Input
輸入1個數N(3 <= N <= 10^9)。
Output
輸出連續整數中的第1個數,如果有多個按照遞增序排列,如果不能分解爲若干個連續整數的和,則輸出No Solution。
Sample Input
15
Sample Output
1
4
7
//
//
//
題意思路:
在這裏插入圖片描述
因爲這一題的數據量過大,如果用正常的思路去解題,就很可能超時。所以這裏最好對循環的範圍有一定的限制。S=(a1+an)n/2
在上式中,S表示整數和,a1表示連續數字的首項,an表示連續數字的末項(也是第n項),n表示項數。顯然這是一個等差數列求和公式,並且將an=a1 + n - 1代入上式中,有:S=(2
a1+n-1)n/2。顯然,n的取值範圍是[2, sqrt(2n)]。同時這一題裏面可以只對n進行循環,因爲對於同一個n,如果存在對應的整數a1,那麼a1必然是唯一的。所以不用對a1進行循環。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int n,s,flag=0;
    cin>>n;
    s=n;
    for(int i=sqrt(2*s);i>=2;i--)
    {
        if((2*s-i*(i-1))%(2*i)==0&&2*s-i*(i-1)>0)
            cout<<(2*s-i*(i-1))/(2*i)<<endl,flag=1;
    }
    if(!flag)
        cout<<"No Solution"<<endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章