为何判断自守数(Automorphic Number)的Java代码输出错误?
代码错误分析与修正
核心错误点
- 平方计算错误:Java中
^是按位异或运算符,不是幂运算,计算平方应该用x * x。如果x数值较大(比如超过46340),int类型存储平方会溢出,建议用long类型存储平方值。 - 位数计算逻辑错误:原代码的for循环逻辑完全混乱,没有正确算出原数的位数。正确的做法是通过循环对原数取余、整除10来统计位数,或者直接把数字转成字符串取长度。
- 判断逻辑错误:
Math.pow返回double类型,用它做取余运算会有精度问题,且逻辑完全搞反——应该是取平方数的最后n位(n是原数的位数)和原数比较,而非原代码中的错误逻辑。
修正后的代码
import java.util.Scanner; public class AutomorphicOrNot { public static void main(String[] args) { System.out.println("Enter a number:"); Scanner sc = new Scanner(System.in); int x = sc.nextInt(); // 用long存储平方,避免int溢出 long square = (long) x * x; // 通过字符串获取原数的位数 int digitCount = String.valueOf(x).length(); // 计算10的digitCount次方,用于截取平方数的最后n位 long divisor = (long) Math.pow(10, digitCount); // 比较平方数的最后n位与原数 if (square % divisor == x) { System.out.println("It is an automorphic number"); } else { System.out.println("It is not an automorphic number"); } sc.close(); } }
纯数字操作的位数计算方式(无需字符串)
如果不想用字符串处理,也可以用循环统计位数:
// 替换原代码中digitCount的计算部分 int temp = x; int digitCount = 0; // 处理非0数字的位数统计 while (temp != 0) { digitCount++; temp = temp / 10; } // 单独处理0的情况,0的位数为1 if (x == 0) { digitCount = 1; }
内容的提问来源于stack exchange,提问作者apocalyptic
相关产品推荐
相关产品推荐

