You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在随机数数学测验中排除质数并限制商不超过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:45:27