概率计算。在标注编号分别为1,2,…,n的n张牌中抽取3张,试求抽出3张牌编号之和为素数的概率。输入整数n(3<n<=3000),输出对应的概率(四舍五入到小数点后第3位)。
思路:
组合问题,先求出组合后一共有多少种组合方式,化简后为sum=n*(n-1)*(n-2)/6,现在只需要确定和为素数的3张牌有几组,第一个数i取值范围(1,n-2),第二个数j取值范围(1+i,n-1),第三个数k取值范围(j+1,n),三个数求和s,最后判断有num个s是素数,概率则为per=num/sum。
流程图:
代码:
#include<time.h>
#include<stdio.h>
#include<math.h>
int su(int s){
int f=1;
for(int i=2;i<=s/2;i++)
{
if(s%i==0) //能整除为合数
{
f=0;
break;
}
}
return f;
}
int main(){
double op,ed;
double time;
op=clock();
int n,num=0,f,sum,s;
double per;
printf("请输入牌数n(3<n<=3000):");
scanf("%d",&n);
for(int i=1;i<=n-2;i++){
for(int j=1+i;j<=n-1;j++){
for(int k=j+1;k<=n;k++){
if(i!=j&&i!=k){
s=i+j+k;
f=su(s);
if(f==1)
num++;
}
}
}
}
sum=n*(n-1)*(n-2)/6;
per=(double)num/sum;
printf("3张牌编号之和为素数的概率为:%.3lf\n",per);
ed=clock();
time=ed-op;
printf("\n");
printf("time=%lfms\n",time);
return 0;
}
结果: