题目:在标注编号分别为1,2,…,n的n张牌中抽取3张,试求抽出3张牌编号之和为素数的概率。 输入整数n(3<n≤3000),输出对应的概率(四舍五入到小数点后第3位。)
组合三张牌可以使用三重循环,第一重i的取值范围(1,n-2),第二重j的取值范围(1+i,n-1),第三重k的取值范围(j+1,n),定义一个函数issu(n)判断n是否是素数,num为3张牌编号之和为素数的组合数,每次循环如果issu(i+j+k)为真,则num++,所有的组合方式有sum=n*(n-1)*(n-2)/6 种,所以概率为sum/num
代码
import java.text.DecimalFormat;
import java.util.Scanner;
public class test_04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
DecimalFormat df = new DecimalFormat("0.000");
int n = sc.nextInt();
// 总数
int sum = n * (n - 1) * (n - 2) / 6;
int num = 0;//计算符合条件的个数
for (int i = 1; i <= n - 2; i++) {
for (int j = i + 1; j <= n - 1; j++) {
for (int k = j + 1; k <= n; k++) {
if (issu(i + k + j)) {
num++;
//System.out.println(i + j + k);
}
}
}
}
System.out.println("概率为: " + df.format((float) num / sum));//先将一个数转换为float再计算
}
public static boolean issu(int n) {
boolean su = true;
for (int i = 2; i <= Math.sqrt(n); i++)
if (n % i == 0) {
su = false;
break;
}
return su;
}
}
运行结果:
这个题思路非常简单,只需要简单的三重循环就可以做出来,关键在于每次循环ijk的取值。