c语言这道题怎么做

2025-03-13 14:20:07
推荐回答(3个)
回答1:

#include 

#include 

#include 

#include 

double problem1(int n)

{

    double p = 1.0;

    int i;

    for(i = 365;i > 365 - n;i--){

        p *= (double)i / 365;

    }

    return 1.0 - p;

}

int problem2()

{

    double min = 1.0;

    double tmp;

    int n;

    int i;

    for(i = 2;i <= 365;i++){

        tmp = fabs(problem1(i) - 0.5);

        if(min > tmp){

            min = tmp;

            n = i;

        }

    }

    return n;

}

int issame(int day[],int n)

{

    int year[365];

    memset(year,0,sizeof(year));

    int i;

    for(i = 0;i < n;i++){

        if(!year[day[i]-1]){

            year[day[i]-1] = 1;

        }

        else{

            return 1;

        }

    }

    return 0;

}

double problem3(int n,int count)

{

    int day[n];

    int i,j;

    double num = 0.0;

    for(j = 0;j < count;j++){

        for(i = 0;i < n;i++){

            day[i] = rand() % 365 + 1;

        }

        if(issame(day,n)){

            num++;

        }

    }

    return num / count;

}

int main()

{

    printf("result of problem1:%lf\n",problem1(30));

    printf("result of problem2:%d\n",problem2());

    printf("result of problem3:%lf\n",problem3(30,10000));

    return 0;

}

回答2:

理论结果:
#include
int main()
{
int i;
double p = 1;
for(i=0;i<30&&i<=365;i++)
{
p = p * (365-i)/365;
}
printf("30名学生的班级里,两个学生的生日是同一天的概率是%lf\n",1-p);
}

模拟10000次的结果:
#include
#include
#include
#define num 10000

int main(int argc, char* argv[])
{
int i,j,t,stat;
int n;
int* p;
int repeat;
if(argc>1) sscanf(argv[1],"%d",&n);
else n=30;
srand(time(0));
if(n>=365)
{
printf("%d人的测试中,存在2人同一天生日的概率是1\n",n);
}
else
{
p = (int*)malloc(sizeof(int)*n);
t = num;
stat = 0;
while(t--)
{
repeat = 0;
for(i=0;i p[i] = rand() % 365;
for(i=0;i for(j=i+1;j if(p[i]==p[j])
repeat = 1;
stat += repeat;
}
printf("%d人的测试中,存在2人同一天生日的概率是%lf\n",n,1.0*stat/num);
}
}

回答3:

能等到下周一吗5555555~很想做这道题但今天得收工了
如果到时候还没人的话就归我了哈哈