C中的基本枚举效率

Basic Enumeration Efficiency in C

我正在尝试获得一些飞云技术,并且正在研究这些类型的问题。

从 1774 年到 1788 年有 16 位大陆会议主席。参加美国历史研讨会的五名学生每人选择其中一位做报告。如果所有校长被选中的可能性均等,请计算至少有两名学生选择同一位校长的概率。

#include <stdio.h>
int main() 
{
int tot=0, probc=0, a=1, b=1, c=1, d=1, e=1, cnt=16;

while(e<=cnt)
{
   while(d<=cnt)
    {
        while(c<=cnt)
        {
            while(b<=cnt)
            {
                while(a<=cnt)
                {
                    if(a==b){++probc;}
                    else if(a==c){++probc;}
                    else if(a==d){++probc;}
                    else if(a==e){++probc;}
                    else if(b==c){++probc;}
                    else if(b==d){++probc;}
                    else if(b==e){++probc;}
                    else if(c==d){++probc;}
                    else if(c==e){++probc;}
                    else if(d==e){++probc;}
                    ++a;++tot;
                }
                a=1;++b;
            }
            b=1; ++c;
        }
        c=1; ++d;
    }
    d=1;++e;
}
printf("%d / %d", probc,tot);
return 0;
}
output:
524416 / 1048576

有什么想法可以提高效率吗?我可以研究哪些技术?第四,如何使这个过程更合乎逻辑且更短?特别是我可以看到循环,或者 else if,我可以压缩这些参数吗?

这是一道比较简单的概率题。无需编程。要计算至少有两名学生选出同一位总统的几率,如果您计算没有学生选出同一位总统的几率,然后取其倒数,就更容易了。

按顺序考虑学生:

  1. 学生 #1 可以选择 16 位总统中的任何一位,而不必担心重叠。选择一位独特总统的机会 = 16/16.
  2. 学生 #2 有 15/16 的机会选出一位独特的总统。
  3. 学生 #3 有 14/16 的机会。
  4. 学生 #4 有 13/16 的机会。
  5. 学生 #5 有 12/16 的机会。

由于这些是独立的选择,您可以将它们相乘以获得每个人选出一位独特总统的总体机会。

16/16 * 15/16 * 14/16 * 13/16 * 12/16
= 4095/8192
≈ 49.98%

但是请记住,我们正在寻找与此相反的结果。答案是:

1 - 4095/8192
= 4097/8192
≈ 50.01%