2026世界杯在哪_世界杯亚洲预选赛积分 - ifexchina.com

小蓝和小黄的密码锁(排列组合)

前几日,我在路上走着的时候,看着路边密密麻麻摆满了共享单车。时不时有两三人去扫码,解锁。我们这里有四种共享单车“摩拜单车,小黄车,小蓝单车和小鸣单车”。其中,小黄车和小蓝单车与其他两种不一样,其他车是扫码解锁,这两种是密码锁,而且还是两种不同的密码锁。

分别是这样的:

小黄车密码锁

和这样的:

小蓝单车密码锁

看到这两种锁,我就想,我最近在自学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 种密码,相比之下还是小黄车的密码锁安全一点。可是我发现有非常多的共享单车都被破坏,加私锁,拆锁。。。。。。

在此,我想呼吁大家爱惜共享单车。共享单车给了我们便利,让我们大家一起爱护它们,让它们更好的为我们服务_