Java题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

前言:这是一个有意思的题目

​ 为什么说他有意思呢?因为这道逻辑并不复杂,也看到许多不同的思路,所以自己总结了一下

并且大部分的参考答案思路可能并不严谨

完全平方数是什么

难点其实是对完全平方数的理解, 先引用一些完全平方数的概念:

若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。例如,a=b的平方,b为整数,那么我们就说a是完全平方数。

1、完全平方数是非负数,0也是完全平方数,而一个完全平方数的项有两个,一正一负,数值相同;
2、完全平方数的个位数字必须是0、1、4、5、6、9,而个位数是2、3、7、8的整数一定不是完全平方数;
3、奇数的平方的个位数字为奇数,十位数字为偶数;
4、在两个相邻的整数的平方数之间的所有整数都不是完全平方数;
5、设连续的自然数是K,K+1,则K*(K+1)=K^2+K=(K+1/2)^2-1/4,所以两个连续自然数的乘积一定不是平方数。

这里先给出网上大部分的解题思路

/**
 * @author JavierHouse
 * 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少
 * 分析:
 *  按照给题的思路
 *  假设这个整数是i
 *  定义两个未知数为num1 num2
 *  num1 = (i + 100) * (i + 100)
 *  num2 = (i + 100 + 168) * (i + 100 + 168)
 *  因为不知道i为多少的情况,所以我们从0-100000遍历i来计算num1与录num2是否符合要求
 */
public class Test {
    public static void main(String[] args) {
        //duoble num1 num2
        double num1,num2;
        //循环计算i是否符合要求
        for (int i = 0; i < 100000; i++) {
            //得到i循环的num值
            num1 = Math.sqrt((i + 100));
            num2 = Math.sqrt((i + 268));
            //判断num是否为整数
            if (num1 == (int)num1 && num2 == (int)num2 ) {
                System.out.println(i);
            }
        }
    }
}

计算结果:

21
261
1581

思路分析:

在i不确定的情况下通过不断的计算来判断是否符合要求,这里其实思路并不严谨,也有直接从-100计算到int的最大值,相对来说其实也并不是特别严谨,并且效率较低

改进思路:

/**
 * @author JavierHouse
 * 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少
 * 分析:
 * 按照给题的思路
 * 假设这个整数是num
 * (num+100) = i * i
 * (num+100+168) = j * j
 * 得到
 * (j * j) - (i * i) = 168
 * (j + i)(j - i) = 168
 * j - i 最小等于 1 时 j 与 i 都不大于 168 并且j > i
 * 等到如下解:
 */
public class TestDemo {
    public static void main(String[] args) {
        //i的平方是完全平方数并且i小于168
        for (int i = 0; i < 168; i++) {
            //j的平方是完全平方数,j小于168并且大于i
            for (int j = i + 1; j < 168; j++) {
                //判断是否符合条件
                if (j * j - i * i == 168) {
                    System.out.println(i * i - 100);
                }
            }
        }
    }
}

计算结果:

-99
21
261
1581

在作者的笔记本上持续测试的计算时间只有1ms

只有原来的百分之15次就能得到结果,并且计算得到-99(负整数没有限制不在范围内)

尽管还可以再拆分,但此时的效率已经非常高(只需要14028次循环就能得到结果)

2023-12-14添加
因为评论区提问比较多,所以这里提供一个优化代码
以下提供伪代码(没有实际运行过)
随手敲的哈哈哈

forint i = 0; i<(168/4);i++{
double v = Math.sqrt(168+(i*i));
if(v==(int)v) {
System.out.println((int)(Math.pow(i,2)-100));
}
}
  • 25
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值