给一个数M,则有自然数1~N前面加上符号运算得到M,求出最小的N并输出,例如:M=12,1+2+3+4+5+6-7=12 输出7;该如何解决

给一个数M,则有自然数1~N前面加上符号运算得到M,求出最小的N并输出,例如:M=12,-1+2+3+4+5+6-7=12 输出7;
题目:给一个数M,则有自然数1~N前面加上符号运算得到M,求出最小的N并输出,例如:M=12,-1+2+3+4+5+6-7=12     输出7;
程序:
#include <iostream>
#include <cmath>

using   namespace   std;

int   main()
{
        int   M,n,distance;
       
        cout   < <   "Please   input   the   valua   of   M:   "   < <   endl;
        cin   > >   M;
       
        n   =   (int)((   sqrt(8   *   M)   -   1   )   /   2);   //   < <==     n(n+1)/2   > =   M
        if(   n   *   (n+1)/2   <   M   )
                n   ++;
        distance   =   n   *   (   n   +   1)   /   2   -   M;
        while(distance   %   2)
        {
              n   ++;
              distance   +=   n;
        }
        cout   < <   n   < <   endl;  
       
        return   0;
}
不知那位大虾能解释一下这里面代码的含义,最好把重要的地方都加上注释,并且容易懂的...................

------解决方案--------------------
n = (int)(( sqrt(8 * M) - 1 ) / 2); // < <== n(n+1)/2 > = M
=====================
我看你主要是不懂上面的吧,其实很简单.
这样想, 对于1~n如果全部都是+应该得到最大值,而这个最大值如果都小于M显然n不够大.
而1~n全部加起来应该是(1+n)n/2,因此n^2+n-2M> =0.
剩下的就是一个抛物线函数的图像问题了,对于方程n^2+n-2M=0的图像它的对称轴小于0且开口向上.同时当n=0的时候为-2M显然小于0, 因此这个抛物线应该是和x轴相交开口向上的,有一个根小于0,一个根大于0.

对于小于0的不用考虑,因为n> 0,因此那个大于0的根就是n的最小值.
根据求根公式x=-b*sqrt(b^2-4ac)/2a 得到n> =(sqrt(8M+1)-1)/2