Java实现无isprime()函数的第n个素数,输入超2无输出问题排查
问题分析与修复
核心问题
你的代码输入大于2时无输出,根源是**num_primes变量作用域错误**:
- 在
do-while循环内部定义num_primes,每次循环都会重置为0,随后自增为1,永远只能给primes[1]赋值 - 当输入的
num大于2时,primes[num-1]始终为0,循环条件primes[num - 1] == 0永远成立,程序卡死在无限循环里
此外,is_prime函数存在冗余逻辑,且可以通过减少循环次数优化性能。
修复后的代码
import java.util.Scanner; class PrimeNumberFinder { static boolean is_prime(int number, int[] prime_numbers) { if (number <= 1) return false; // 只需检查到目标数的平方根,减少无效计算 double sqrtLimit = Math.sqrt(number); for (int primeNumber : prime_numbers) { if (primeNumber == 0 || primeNumber > sqrtLimit) break; if (number % primeNumber == 0) { return false; } } return true; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter the nth prime number you want: "); int targetNth = scanner.nextInt(); int[] primes = new int[targetNth]; int currentNumber = 2; primes[0] = 2; // 将计数变量移到循环外,持续记录已找到的素数数量 int foundPrimesCount = 1; if (targetNth > 1) { do { currentNumber++; if (PrimeNumberFinder.is_prime(currentNumber, primes)) { primes[foundPrimesCount] = currentNumber; foundPrimesCount++; } } while (foundPrimesCount < targetNth); } System.out.printf("Your Prime number is %d", primes[targetNth - 1]); scanner.close(); } }
关键修改点
- 调整计数变量作用域:把
foundPrimesCount(原num_primes)移到循环外,初始值设为1(已存入第一个素数2),每次找到新素数时自增,确保能正确填充数组到目标位置。 - 优化循环终止条件:用
foundPrimesCount < targetNth替代原数组判断,逻辑更直接,避免未初始化值干扰。 - 简化素数判断逻辑:
- 直接排除小于等于1的数
- 计算目标数的平方根,素数超过该值时终止循环,减少无效遍历
- 移除冗余的
continue语句,精简代码
- 优化变量命名:将
num改为targetNth、prime改为currentNumber,提升代码可读性。
内容的提问来源于stack exchange,提问作者Pranshu
相关产品推荐
相关产品推荐

