C++连续自然数和

#include<bits/stdc++.h>

using namespace std;

inline unsigned nsum(unsigned s,unsigned e)

{

    unsigned sum = 0;

    unsigned n = (e - s + 1);

    if(!(n%2))

        sum = n/2 * (s + e);

    else

        sum = (s + e)/2 * n;

    return sum;

}

unsigned bsearch(unsigned start,unsigned end,unsigned key) 

{

    unsigned mid = 0;

    unsigned s = start;

    unsigned v = 0;

    while(start < end)

    {

        mid = (start + end)/2;

        v = nsum(s,mid);

        if(v == key)   

            return mid;

        else if(v > key) 

            end = mid - 1;

        else if(v < key)

            start = mid + 1;

    }   

    mid = (start + end)/2;

    v = nsum(s,mid);

    return v == key ? mid : -1;

}

int main()

{

    unsigned m;

    unsigned s,e,sum;

    scanf("%d",&m);

    for(int i = 1; i <= m/2+1; i++)

    {

        unsigned end = bsearch(i,m/2+1,m);

        if(end != -1)

            printf("%d %d\n",i,end);

    }

    return 0;

}

猜你喜欢

转载自blog.csdn.net/csdn_3011692917/article/details/79678520