给一个数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
题目:给一个数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