zoukankan      html  css  js  c++  java
  • 求X值问题

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

    题目描述

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

  • 相关阅读:
    Linux下如何查看版本信息
    SUSE12Sp3安装配置.net core 生产环境(2)-安装.NET Core 2.2.1 runtime 并运行.NET代码
    NET CORE Learning
    JWT(JSON Web Token)原理简介
    定性分析与定量分析的异同及优缺点
    《React16免费基础视频教程》【2】
    《React16免费基础视频教程》【1】
    《狂神说-JUC》【3】
    《狂神说-JUC》【2】
    《狂神说-JUC》【1】
  • 原文地址:https://www.cnblogs.com/cnroadbridge/p/13557253.html
Copyright © 2011-2022 走看看