前言:这是一个有意思的题目
为什么说他有意思呢?因为这道逻辑并不复杂,也看到许多不同的思路,所以自己总结了一下
并且大部分的参考答案思路可能并不严谨
完全平方数是什么
难点其实是对完全平方数的理解, 先引用一些完全平方数的概念:
若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。例如,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添加
因为评论区提问比较多,所以这里提供一个优化代码
以下提供伪代码(没有实际运行过)
随手敲的哈哈哈
for(int 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));
}
}