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

题目描述

已知有整数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 国际许可协议进行许可。

求X值问题的更多相关文章

  1. ACM3 求最值

    /*2*2014.11.18*求最值*描述:给定N个整数(1<=N<=100),求出这N个数中的最大值,最小值.*输入:多组数据,第一行为一个整数N,第二行为N个不超过100的正整数,用空 ...

  2. [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...

  3. hdu4521-小明系列问题——小明序列(线段树区间求最值)

    题意:求最长上升序列的长度(LIS),但是要求相邻的两个数距离至少为d,数据范围较大,普通dp肯定TLE.线段树搞之就可以了,或者优化后的nlogn的dp. 代码为  线段树解法. #include ...

  4. javascript之求最值

    求最值: var selections = $("#deliveryGridSalesOrGoods").datagrid('getRows'); var costPrice = ...

  5. poj3264(线段树区间求最值)

    题目连接:http://poj.org/problem?id=3264 题意:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,多次求任一区间Ai-Aj中最大数和最小数的差. ...

  6. Sql示例说明如何分组后求中间值--【叶子】

    原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type        name price -- ...

  7. hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

    题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...

  8. C语言 · 求arccos值

    算法提高 7-2求arccos值   时间限制:10.0s   内存限制:256.0MB      问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[- ...

  9. 位运算求最值 学习笔记 (待补充QAQ)

    没有什么前言?直接进入正题qwq 俩俩异或 求最值: 建trie树 O(n)枚举每个数找这个数的最值,每次反走就成,还可以剪枝一波(如果在某位已经小于ans显然可以直接return? void Ins ...

  10. [note]一类位运算求最值问题

    [note]一类位运算求最值问题 给定一些数,让你从中选出两个数a,b,每次询问下列中的一个 1.a and b的最大值 2.a xor b的最大值 3.a or b的最大值 神仙们都是FWT,小蒟蒻 ...

随机推荐

  1. 在npm发布自己造的轮子

    提到封装组件,发布到npm,很多同学都会觉得很神秘.但其实,npm包无非就是我们平时写的比较独立且可复用的模块.当然,想要发布,除了基础组件的编写外,还要进行一些包装.下文通过一个简单的案例,和大家一 ...

  2. Python os.fdopen() 方法

    概述 os.fdopen() 方法用于通过文件描述符 fd 创建一个文件对象,并返回这个文件对象.高佣联盟 www.cgewang.com Unix, Windows上可用. 语法 fdopen()方 ...

  3. PHP ignore_user_abort() 函数

    实例 设置为 false(默认)- 与客户机断开会终止脚本的执行: <?phpignore_user_abort();?>高佣联盟 www.cgewang.com 上面代码的输出如下: 0 ...

  4. MySQL选错索引导致的线上慢查询事故

    前言 又和大家见面了!又两周过去了,我的云笔记里又多了几篇写了一半的文章草稿.有的是因为质量没有达到预期还准备再加点内容,有的则完全是一个灵感而已,内容完全木有.羡慕很多大佬们,一周能产出五六篇文章, ...

  5. 创建githup远程库并关联

    第一种方法:远程new仓库时直接勾选初始化仓库,然后克隆到本地即可(注:本地对应层不可再初始化仓库git init).克隆下来的仓库已经与远程库建立了管理git removte 第二种方法:本地下面有 ...

  6. tensorflow2.0 实现gpu和cpu切换

      昨天把GPU版本的tf2.0 安装成功之后,现在所有的代码运行居然都在gpu上跑了,并且在对gpu使用情况没有限制的条件下,既然gpu内存跑满了,代码就崩了怎么样才能随心所欲的指定代码是在cpu还 ...

  7. JVM进行篇

                                              结合字节码指令理解Java虚拟机栈和栈帧          栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的 ...

  8. Android BottomNavigationView的用法

    BottomNavigationView是相当于一个导航的标签,但是它的形式就是像QQ,微信之类的界面 这三个图标就是BottomNavigationView的体现. 至于写出后怎样绑定这三个界面,就 ...

  9. 【LeetCode/LintCode】 题解丨字节跳动试题:第k大的子数组

    给定一个长度为n的数组a,它有n(n+1)/2​​个子数组.请计算这些子数组的和,然后按照升序排列,并返回排序后第k个数. 1≤n≤10​^5 1≤a​i≤10^​9 1≤k≤​n(n+1)/2 在线 ...

  10. C#LeetCode刷题之#1-两数之和(Two Sum)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3762 访问. 给定一个整数数组和一个目标值,找出数组中和为目标值 ...