小蓝和小黄的密码锁(排列组合)
前几日,我在路上走着的时候,看着路边密密麻麻摆满了共享单车。时不时有两三人去扫码,解锁。我们这里有四种共享单车“摩拜单车,小黄车,小蓝单车和小鸣单车”。其中,小黄车和小蓝单车与其他两种不一样,其他车是扫码解锁,这两种是密码锁,而且还是两种不同的密码锁。
分别是这样的:
小黄车密码锁
和这样的:
小蓝单车密码锁
看到这两种锁,我就想,我最近在自学C语言编程,是否可以学以致用,写两个小小的程序来计算一下这两种锁分别有多少种密码的可能。
首先我们先做一个分析,这两种锁有什么不同呢?
小黄车(ofo) 的锁是滚轮锁,密码为可互相重复的四位数
小蓝单车(bluegogo) 的锁类似以前小时候密码日记本那种锁,一个数字只能按下去一次,一组密码中同样的数字不会出现两次,密码是不重复的四位数,并且同样四位数排序不同结果是相同的(组合)
其实很简单,心里一想就出来了,其实不就是从 '0001'-'9999' 种加上 '0000' 这种可能,共10000种。可是如何使用 c 语言写出来呢?
哈哈,只要枚举每一个位,并把每一种可能增加起来,就可以得到总数了,代码如下:
#include
int main()
{
int a, b, c, d;
int total;
//枚举每一位数,得到一种可能,总数就加一
for(a=0; a<=9; a++)
for(b=0; b<=9; b++)
for(c=0; c<=9; c++)
for(d=0; d<=9; d++)
total++;
//下同 printf("ofo's password can have %d possibilities.\n",total);
fprintf(stdout,"ofo's password can have %d possibilities.\n",total);
return 0;
}
程序输出:
Ofo's password can have 10000 possibilities.
小黄车的这个简单,小蓝单车的就不好做了,虽然学过排列组合的都可以口算出来,可是到了程序里,怎么去重是一个难题。让我们先看两个公式:
组合公式
排列公式
我们可以根据这个公式来计算小蓝单车的密码可能性。小蓝单车的密码是四位不重复的密码,并且同四位数排序不同结果一样,这其实就是数学中的“组合”。
根据公式,我写出以下代码:
#include
int main()
{
int a, b, c, d;
int up, down;
int n, m;
int total;
up = down = n = m = total =0;//初始化
//按照公式,我们要先算出10选4的全排列
for(a=0; a<=9; a++)
for(b=0; b<=9; b++)
for(c=0; c<=9; c++)
for(d=0; d<=9; d++)
//注意这里是全排列,一个数字在一组中只能出现一次,所以需要 个十百千 各不相等
if(a!=b && a!=c && a!=d &&
b!=c && b!=d &&
c!=d)
{
up++;
}
//接着算出4选4的全排列
down = 1;
for(n=4; n>=1; n--)
down = down*n;
//最后把『10选4』除以『4选4』,就能得出结果
total = up/down;
printf("A(4,10) = %d\nA(4,4) = %d\n",up,down);
printf("Bluegogo's password can have %d possibilities.",total);
return 0;
}
程序输出:
A(4,10) = 5040
A(4,4) = 24
Bluegogo's password can have 210 possibilities.
好啦,两种单车锁的密码可能性都算出来了,小蓝单车那种锁拥有 210 种密码,而小黄车的那种滚轮锁拥有 10000 种密码,相比之下还是小黄车的密码锁安全一点。可是我发现有非常多的共享单车都被破坏,加私锁,拆锁。。。。。。
在此,我想呼吁大家爱惜共享单车。共享单车给了我们便利,让我们大家一起爱护它们,让它们更好的为我们服务_