这,其实是一道数学题,难就难在要把数学模型用编程语言实现,其中的规律如果看不出来就比较鸡肋,这类题可以算是智商题,做这类题千万不能紧张,血的教训。

题目描述

已知有整数x,x + 100为一个平方数、x + 168也是一个平方数、请写出计算程序求出x的所有可能?

题目出处: 浙江某研究院笔试题

题解

正如开头引言所说的,这,其实是道数学题。所以,我们先从数学的角度去分析这个问题。

假设这是道选择题

不要硬算、你直接把选项套进去嘛,运气差一点也不过四次脑力循环。

假设这是道应用题

由题意得:
x + 100 = a ^ 2; (1)
x + 168 = b ^ 2; (2)
(2) - (1) 得
b ^ 2 - a ^ 2 = 68;即 (b + a)(b - a) = 68;
因式分解,分类讨论
68 = 1 * 68 (3)
68 = 2 * 34 (4)
68 = 4 * 17 (5)
玄学来了, 凑。。。
眼睛一瞄,只有(4)是同偶数,就先拿它试试
(b + a) = 34; (6)
(b - a) = 2; (7)
(7) + (6) 得 2b = 36,即 b = 18;
因此 x = 18 ^ 2 - 168 = 156;
(3)(5)不符合整数定义。

建模

分类讨论

(b + a) (b - a) = num.

  • 当a和b为奇数,num为奇数
  • 当a和b为偶数,num为偶数
  • 当a和b一奇一偶,num为奇数

x的递推公式(前提a > b)

sqrt_a = Math.sqrt(x + a);(1)
sqrt_b = Math.sqrt(x + b); (2)
(sqrt_a + sqrt_b)(sqrt_a - sqrt_b) = a - b;(3)
令sqrt_a + sqrt_b = cur;(4) 那么 sqrt_a - sqrt_b = (a - b) / cur;(5)
(4) + (5) 得:
2 * sqrt_a = (cur + (a - b) / cur);(6)
将(1)代入(6)得:
x = ((cur + (a - b) / cur) / 2) ** 2 - a;

看到这里我们就很高兴了,这个程序算是解决了一般,第一个是将被除数num分奇偶分类讨论,第二个是推导出了所求值x递推公式,在写程序的时候,我们只要保证分类讨论中a和b的情况就好了。

实现代码

// 求X, 已知 x + 100 为一个平方数、x + 168也是一个平方数,请写出计算程序?

function getX(a, b) {
const res = [];
// a比b小就交换位置他俩
if (a < b) {
[a, b] = [b, a];
}
let dividend = a - b;
let cur = dividend;
if (dividend % 2 === 0) {
// 循环被除数一半就好了
while (cur >= Math.sqrt(dividend)) {
if(cur % 2 === 0 && ((dividend / cur) % 2 === 0)) {
res.push(((cur + dividend / cur) / 2) ** 2 - a);
}
// 无视奇数,直接到下个偶数
cur = cur - 2;
}
} else {
while (cur >= Math.sqrt(dividend)) {
if(cur % 2 !== 0 && (dividend / cur) % 2 !== 0) {
res.push(cur / 2 + dividend / (2 * cur) - a);
}
cur--;
}
}
return res;
} const res = getX(168, 100);
console.log(res); // [ 156 ]


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

最新文章

  1. Oracle性能优化
  2. maven提示invalid LOC header (bad signature)的解决办法
  3. Delphi 中 动态创建的Panel无法改变颜色的解决办法
  4. 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解
  5. 3款强大的BootStrap的可视化制作工具推荐
  6. 移动存储卡仍然用FAT32文件系统的真相
  7. ReiserFS与EXT3的比较
  8. 浙江工商大学15年校赛E题 无邪的飞行棋 【经典背包】
  9. C#操作EML邮件文件实例(含HTML格式化邮件正文和附件)
  10. JAVA基础第五组(5道题)
  11. 使用whistle模拟cgi接口异常:错误码、502、慢网速、超时
  12. Android项目实战登录&amp;注册
  13. Matlab文本处理:提取指定内容
  14. Spark 论文篇-论文中英语单词集
  15. 获取URL某个参数
  16. docker 查看容器的网络连接
  17. while(scanf(&quot;%d&quot;,&amp;n)!=EOF)与while(cin&gt;&gt;n)
  18. sourceTree&quot;重置提交&quot;和&quot;提交回滚&quot;的区别
  19. SDUT3145:Integer division 1(换零钱背包)
  20. gtest学习

热门文章

  1. pagehelper的使用和一些坑!
  2. C/C++编程笔记:C语言预处理命令是什么?不要以为你直接写#就行!
  3. 毒瘤dp 学校食堂
  4. Return Merchandise Authorization (RMA)
  5. JDK8的Stream操作
  6. Spring Joinpoint
  7. Android 的OkHttp(发送网络请求)
  8. “随手记”开发记录day04
  9. python操作Excel,你觉得哪个库更好呢?
  10. 20、Java 泛型