组合数学 加法法则和乘法法则

原文链接: 组合数学 加法法则和乘法法则

例1.1.6

•1) 求小于10000的含1的正整数的个数

•2) 求小于10000的含0的正整数的个数

1)小于10000的不含1的正整数可看做4位数, 但0000除外.   故有9×9×9×9-1=6560个.

含1的有:9999-6560=3439个

另:  全部4位数有10^4个,不含1的四位数有9^4 个, 含1的4位数为两个的差: 10^4 -9^4 = 3439个。

2) 不含0的1位数有9个,2位数有9^2个,3位数有9^3个,4位数有9^4个,故不含0小于10000的正整数有

9+9^2 +9^3 +9^4 =(95-1)/(9-1)=7380个;

含0小于10000的正整数有:9999-7380=2619个

注:“含0”和“含1”不可直接套用。0019含1但不含0。在组合的习题中有许多类似的隐含的规定,要特别留神。

let c1 = 0
let c0 = 0

for (let i = 1; i < 10000; i++) {
  String(i).includes('0') ? c0++ : c0
  String(i).includes('1') ? c1++ : c1
}
console.log(c0, c1)
2619 3439

Ø例1.2.2:从[1,300]中取3个不同的数,使这3个数的和能被3整除,有多少种方案?

解:将[1,300]分成3类:

A={i|i≡1(mod 3)}={1,4,7,…,298},

B={i|i≡2(mod 3)}={2,5,8,…,299},

C={i|i≡3(mod 3)}={3,6,9,…,300}.

要满足条件,有四种解法:

1)3个数同属于A;   2)3个数同属于B

3)3个数同属于C;   4)A,B,C各取一数.

故共有3*C(100,3)+100^3 =485100+1000000=1485100

由于三个数没有顺序,所以按照由大到小进行枚举

let c = 0
for (let i = 1; i <= 300; i++)
  for (let j = i + 1; j <= 300; j++)
    for (let k = j + 1; k <= 300; k++)
      // i != j && j != k && i != k && (((i + j + k) % 3) == 0) ? c++ : c
      if (i != j && j != k && i != k && (((i + j + k) % 3) == 0))
        c++
console.log(c);
1485100
这种枚举方式会使答案变大,因为三个数是不同的
for (let i = 1; i <= 300; i++)
  for (let j = 1; j <= 300; j++)
    for (let k = 1; k <= 300; k++)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值