如何在随机数数学测验中排除质数并限制商不超过10?
解决方案
1. 排除大于10的质数
用字符串存储质数并非高效做法,推荐用质数判断方法或预定义质数集合实现过滤,后者更直观且性能更优。
先实现一个质数判断工具方法:
private static boolean isPrime(int number) { if (number <= 1) return false; if (number <= 3) return true; if (number % 2 == 0 || number % 3 == 0) return false; for (int i = 5; i * i <= number; i += 6) { if (number % i == 0 || number % (i + 2) == 0) return false; } return true; }
生成num1时,循环过滤掉大于10的质数:
int num1; do { num1 = (int) (Math.random() * 100 + 1); // 若为大于10的质数则重新生成 } while (isPrime(num1) && num1 > 10);
2. 限制商不超过10
当前先生成num1再选约数的逻辑容易出现商超10的情况,更高效的方式是反向生成:先确定1-10之间的商,再生成除数,最后计算被除数,从根源避免无效组合:
public void gameContinue() { int quotient; int num2; int num1; // 生成1-10之间的商 quotient = (int) (Math.random() * 10 + 1); // 生成除数,确保被除数不超过100(符合原num1范围) do { num2 = (int) (Math.random() * 100 + 1); } while (quotient * num2 > 100); num1 = quotient * num2; // 额外过滤大于10的质数 while (isPrime(num1) && num1 > 10) { quotient = (int) (Math.random() * 10 + 1); do { num2 = (int) (Math.random() * 100 + 1); } while (quotient * num2 > 100); num1 = quotient * num2; } question.setText(num1 + " ÷ " + num2); }
替代方案:保留原逻辑的优化
如果坚持先生成num1再选约数的逻辑,可以修改约数获取方法,只保留能让商≤10的约数:
private static java.util.List<Integer> getValidDivisors(int number) { java.util.List<Integer> divisors = new java.util.ArrayList<>(); for (int i = 1; i <= number; i++) { // 仅保留满足商≤10的约数 if (number % i == 0 && (number / i) <= 10) { divisors.add(i); } } return divisors; }
然后在主方法中合并筛选逻辑:
public void gameContinue() { int num1; java.util.List<Integer> validDivisors; do { num1 = (int) (Math.random() * 100 + 1); validDivisors = getValidDivisors(num1); // 排除大于10的质数,同时确保存在有效约数 } while ((isPrime(num1) && num1 > 10) || validDivisors.isEmpty()); int divisorsRandIndex = (int) (Math.random() * validDivisors.size()); int num2 = validDivisors.get(divisorsRandIndex); question.setText(num1 + " ÷ " + num2); }
补充说明
- 用字符串存储质数的方式可行,但不推荐:比如用
"11,13,17,19,..."通过contains判断,不仅查找效率低,还需要手动维护所有10-100之间的质数,灵活性远不如集合或质数判断方法。 - 反向生成的逻辑更高效,直接规避了无效数值组合,无需反复筛选。
内容的提问来源于stack exchange,提问作者Mervile
相关产品推荐
相关产品推荐

