数学问题

baidu_27549073 2018-08-25 11:58:58
m,n都是整数
(m+n)(n-m)=168
能确定m,n的范围吗?

看到一个算法题,答案是给了个范围,一个数一个数的试,但是没说这个范围怎么来的。
...全文
168 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2018-08-27
  • 打赏
  • 举报
回复
其实如果不管整数问题,这个玩意其实就没有什么范围了,按2楼思路
 for (int A = 1; A < 100000; A++)
{
var B = A + 168;

Console.WriteLine($"m={Math.Sqrt(B)},N={Math.Sqrt(A)}");
}

xuzuning 2018-08-26
  • 打赏
  • 举报
回复
对于 (m+n)(n-m)=168
可知 m、n 均大于等于0,小于等于 168
            for (var m = 0; m < 168; m++)
{
for (var n = 168; n >= 0; n--)
{
var t = (m + n) * (n - m);
if (t == 168)
Console.WriteLine("m={0} n={1}", m, n);
}
}
m=1 n=13
m=11 n=17
m=19 n=23
m=41 n=43
wanghui0380 2018-08-26
  • 打赏
  • 举报
回复
n^2-m^2

就是你这个公式,他代表一个两正方形的面积差,我们也不想复杂的做,就简单的搞。假设面积A,面积B
A-B=168,这个当然是不定方程,既然是面积,我们保证B>0就好,然后B+168就是A,然后分别对A,B开方就好
wanghui0380 2018-08-26
  • 打赏
  • 举报
回复
???额,你高中怎么过来的??平面解析几何,自己去补补把

这东西一看就是平方差变过来的,他的几何意义一看就明白了。
baidu_27549073 2018-08-26
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
            for (var m = -168; m < 168; m++)
{
for (var n = 168; n >= -168; n--)
{
var t = (m + n) * (n - m);
if (t == 168)
Console.WriteLine("m={0} n={1}", m, n);
}
}
m=-41 n=43
m=-41 n=-43
m=-19 n=23
m=-19 n=-23
m=-11 n=17
m=-11 n=-17
m=-1 n=13
m=-1 n=-13
m=1 n=13
m=1 n=-13
m=11 n=17
m=11 n=-17
m=19 n=23
m=19 n=-23
m=41 n=43
m=41 n=-43
事实证明:到达不了 84

是的,感觉你很厉害,能快速的将范围缩小到一个合适的数量级,在这方面我还缺乏很多经验。
我这样是有点钻牛角尖了,当然这里只是一个学习过程,在开发中其实我也碰到过这种问题。
当一个东西性能很差的时候,我会不断的优化逻辑,简化逻辑,最后发现一些东西漏算了或则这个方法泛用性更差了。


xuzuning 2018-08-26
  • 打赏
  • 举报
回复
            for (var m = -168; m < 168; m++)
{
for (var n = 168; n >= -168; n--)
{
var t = (m + n) * (n - m);
if (t == 168)
Console.WriteLine("m={0} n={1}", m, n);
}
}
m=-41 n=43
m=-41 n=-43
m=-19 n=23
m=-19 n=-23
m=-11 n=17
m=-11 n=-17
m=-1 n=13
m=-1 n=-13
m=1 n=13
m=1 n=-13
m=11 n=17
m=11 n=-17
m=19 n=23
m=19 n=-23
m=41 n=43
m=41 n=-43
事实证明:到达不了 84
baidu_27549073 2018-08-26
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:

看了你的,大概明白思路了

引用 3 楼 xuzuning 的回复:

谢谢,给了我很大启发,你这个确实已经很标准了,比参考答案要好很多。有些时候闲一点,就想多思考一点。重要的不是做出来,而是自己能进步。

参考答案是没有显示负数的,我这里还是考虑一下。下面是我简单确定的范围。
(m+n)(n-m)=n^2-m^2=168
当n最小时,m^2最小。但是m^2>=0
所以 n^2-0 >= 168>12^2
结果 n<-12 或 n>-12

n^2最大时候,m^2最大,此时m^2无限接近与n^2的时候,n,m为整数,
当n为正整数的时候,最大的m=n-1 或 m=1-n
n^2-(n-1)^2<=168
2n-1<=168
n<84.5
当n为负整数的时候,最大的m=n+1 或 -n-1
n^2-(n+1)^2<=168
-2n-1<=168
n>-84.5

最后结论是 -13>=m>=-84 或 13<=m<=84

这个题我记得在高中的时候,我做过类似的题,但是现在不记得了,也不会写过程了。
xuzuning 2018-08-26
  • 打赏
  • 举报
回复
其实没必要深入推导(万一算错了,反而麻烦)
适当的扩大些范围,并没有什么不妥,计算机强项就是做简单、单调的工作
wanghui0380 2018-08-26
  • 打赏
  • 举报
回复
前面说了他就是平常差,因为你要正整数,那么假设
(N+1)^2-N^2=N^2+2n+1-N^2=2n+1

也就是 2n+1<=169 那么n<=83 并且n>=13

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧