JAVA编程判断一个数是平方数_Java之判断大整数是否为平方数

在本篇博客中,我们将讨论如何使用有效的算法来判断一个大整数是否为平方数。   给定正整数$n$,如果存在一个整数$m$,满足$m^{2}=n$,那么则称$n$为平方数。因此,判断一个大整数$n$是否为平方数,很自然的想法就是,从1开始,依次递增,判断这个数的平方是否等于给定的数$n$,如果是,则$n$为平方数,如果这个数的平方大于$n$,则$n$不是平方数。这个想法很简单,但可惜的是,效率却很低,因为我们要遍历$\sqrt{n}$个数,当$n$很大时,这样的效率是我们不能忍受的。   那么有没有其他方法呢?这时候,一个公式进入我们的视野,那就是:

$$1+3+5+...+2n-1=n^{2}.$$

看上去这个公式给了我们一点希望,因为我们不需要从1开始一个一个去找,而是只需要寻找至$2\sqrt{n}-1$即可。但我们仔细地分析一下,不难发现,该公式的实质和一个一个找没什么区别,因为我们还是要遍历$\sqrt{n}$个数。   所以,存在有效的算法吗?答案是肯定的!为什么不尝试着去计算$n$的平方根呢?按照这个思路,我们具体的算法,结合牛顿法,步骤如下:

初始值$x_0=1$, 误差$\epsilon$足够小;

按照$x_{n+1}=\frac{1}{2}(x_{n}+\frac{n}{x_{n}})$迭代,直至$|x_{n}^{2}-n|\leq\epsilon$;

对$x_{n}$取整,结果为$m$, 如果$m$的平方为$n$,则$n$为平方数,否则不是平方数。

接下来,我们证明这个算法的有效性。首先,我们证明对于$n\geq1$,都有$x_{n} > \sqrt{n}$。我们使用数学归纳法。

当$n=1$时,$x_{1}=\frac{1}{2}(1+n)>\sqrt{n}$.

假设$x_{n}>\sqrt{n}$,则$x_{n+1}-\sqrt{n}=\frac{x_{n}^{2}+n-2\sqrt{n}x_{n}}{2x_{n}}=\frac{(x_{n}-\sqrt{n})^{2}}{2x_{n}}>0$,所以$x_{n+1}>\sqrt{n}$.

接着我们再证明$x_{n}(n\geq1)$序列递减。因为当$n>0$时,有 $$x_{n+1}-x_{n}=\frac{n-x_{n}^{2}}{2x_{n}}<0.$$ 这是因为当$n\geq1$时,有$x_{n}>\sqrt{n}$.

因此,我们利用第二步的迭代,不停地运算后,所得到的项$x_{n}$与$\sqrt{n}$很接近,只是稍微大一点。因此,该算法的第三步的判断就是正确的了。   下面我们将会给出上述算法的Java程序代码,具体如下:

package Problems;

import java.math.BigInteger;

import java.math.BigDecimal;

public class IS_Square {

public static void main(String[] args) {

// 计算2**128+1

BigInteger F7 = new BigInteger("2").pow(128).add(BigInteger.ONE);

boolean w = is_square(F7);

if(w)

System.out.println(String.format("%s是完全平方数。", F7));

else

System.out.println(String.format("%s不是完全平方数。", F7));

}

// 判断是否为完全平方数

public static boolean is_square(BigInteger F7){

// 牛顿法求解平方根, 求解a的平方根

// x为a的平方根,x的初始值为1, 按x = (x+a/x)/2迭代, 误差为error

BigDecimal x = BigDecimal.ONE;

BigDecimal a = new BigDecimal(F7.toString());

BigDecimal eps = new BigDecimal("1");

final BigDecimal error = new BigDecimal("1E-10");

int scale = 100;

// 进入循环

while(eps.compareTo(error) == 1){ // eps > error

x = x.add(a.divide(x, scale, BigDecimal.ROUND_HALF_UP)).divide(new BigDecimal("2.0"), scale, BigDecimal.ROUND_HALF_UP);

eps = x.multiply(x).subtract(a).abs();

}

BigInteger sqrt = x.toBigInteger(); // 求平方根的整数部分

if(sqrt.pow(2).compareTo(F7) == 0)

return true;

else

return false;

}

}

其输出结果如下:

340282366920938463463374607431768211457不是完全平方数。

如果将Java程序中的$F7=2^{128}$,则输出结果为:

340282366920938463463374607431768211456是完全平方数。

本次分享到此结束,欢迎大家交流~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 自守数是一个正整平方的末尾几位等于该本身的。例如,5的平方是25,25的末尾两位是25,所以5是一个自守。 要判断一个正整数是否为自守,可以使用如下步骤: 1. 将该平方计算出来。 2. 取出该的末尾几位(和要判断的位相同)。 3. 将取出的末尾几位与要判断进行比较,如果相等则该数是自守,否则不是。 例如,如果要判断字5是否为自守,可以使用如下代码: ``` int num = 5; int square = num * num; // 计算平方 int lastTwo = square % 100; // 取出末尾两位 if (lastTwo == num) { System.out.println(num + "是自守"); } else { System.out.println(num + "不是自守"); } ``` 在上面的代码中,我们先计算出5的平方是25,然后取出末尾两位25,最后将取出的末尾两位和5进行比较。因为25等于5,所以输出“5是自守”。 ### 回答2: 自守数是一个,如果它的平方中包含了它本身,则称其为自守。 以Java语言实现判断一个正整数是否为自守的方法,可以按照以下步骤进行: 1. 定义一个isAutomorphicNumber方法,该方法接受一个正整作为参,返回一个boolean值表示是否是自守。 2. 在isAutomorphicNumber方法中,首先将传入的整转换为字符串类型,以便进行后续比较。 3. 计算传入整平方,并将结果转换为字符串类型。 4. 比较平方字符串和原整字符串的后几位是否相等,可以通过使用String类的endsWith方法实现。 5. 如果平方字符串的后几位与原整字符串相等,则返回true,表示是自守;否则返回false,表示不是自守。 以下是使用Java代码实现的示例: ```java public class AutomorphicNumber { public static boolean isAutomorphicNumber(int number) { String numberStr = String.valueOf(number); String squareStr = String.valueOf(number * number); return squareStr.endsWith(numberStr); } public static void main(String[] args) { int num1 = 25; int num2 = 76; if (isAutomorphicNumber(num1)) { System.out.println(num1 + " 是自守"); } else { System.out.println(num1 + " 不是自守"); } if (isAutomorphicNumber(num2)) { System.out.println(num2 + " 是自守"); } else { System.out.println(num2 + " 不是自守"); } } } ``` 通过isAutomorphicNumber方法的测试,可以判断给定的正整数是否是自守,并将结果打印输出。输出结果将根据判断的情况显示不同的信息。 ### 回答3: 自守数是一个正整,它的平方的末尾和它本身的末尾相等。我们可以使用Java编写一个程序来判断一个正整数是否为自守。 首先,我们需要定义一个判断一个正整数是否为自守。该函将接受一个num,表示要判断的正整。我们将num的平方作为一个字符串,然后比较字符串的最后一个字符和num的最后一个字符是否相等。如果相等,则返回true,表示该正整数是自守;如果不相等,则返回false,表示该正整不是自守。 下面是具体的实现代码: ```java public class Main { public static boolean isAutomorphicNumber(int num) { String square = String.valueOf(num * num); char lastDigitOfNum = String.valueOf(num).charAt(String.valueOf(num).length() - 1); char lastDigitOfSquare = square.charAt(square.length() - 1); return lastDigitOfNum == lastDigitOfSquare; } public static void main(String[] args) { int num = 25; // 要判断的正整 if (isAutomorphicNumber(num)) { System.out.println(num + "是自守"); } else { System.out.println(num + "不是自守"); } } } ``` 在上面的代码中,我们定义了一个isAutomorphicNumber函判断一个正整数是否为自守。然后在main函中调用该函判断一个给定的正整数是否为自守。使用25作为示例,运行代码输出结果为"25是自守"。 除了25之外,还有一些其他的自守,如0、1、5、6等。我们可以通过修改num的值来判断其他正整数是否为自守

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值