Java枚举算法一 概率计算

159 阅读1分钟

题目:在标注编号分别为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;

	}

}

运行结果:

图片.png

图片.png

这个题思路非常简单,只需要简单的三重循环就可以做出来,关键在于每次循环ijk的取值。