排列组合问题
分析:
不包含8的数的每一位都不是8,所以1到999每个数的每位都只能由0~7和9构成,总共有
9
3
9^3
93种组合。所以包含8的数字的个数为
1000
−
9
3
=
271
1000-9^3=271
1000−93=271
验证:
int x = 0;
for (int i = 1; i <= 1000; i++) {
if (String.valueOf(i).contains("8")) {
x++;
}
}
System.out.println(x); // 271
上面是从对立面分析的。我们从正面分析,把包含8的数字分为3类,包含一个8,包含2个8和包含3个8.
包含一个8的:首先从3位中挑出一位用于放8,其他两位不能是8,其余两位有9中情况。所以一共是
C
3
1
∗
9
2
C_3^1*9^2
C31∗92种情况
包含2个8的:首先从3位中挑出两位包含8,剩下的一位不包含8,共
C
3
2
∗
9
C_3^2*9
C32∗9种情况
包含3个8的只有一种情况。
所以一共
C
3
1
∗
9
2
+
C
3
2
∗
9
+
1
=
271
C_3^1*9^2+C_3^2*9+1=271
C31∗92+C32∗9+1=271
举一反三:
1到1000中包含6或8的数字
对立面分析:即不包含6也不包含8的情况一共 8 3 8^3 83种,所以包含6或者8的情况有 1000 − 8 3 = 488 1000-8^3=488 1000−83=488
正面分析:
有一位包含6或8:
C
3
1
∗
8
2
∗
2
C_3^1*8^2*2
C31∗82∗2,从3位中挑出一位放6或8,剩下两位都不能用6或8,乘以2是因为放6或者放8.
有两位包含6或8:
C
3
2
∗
8
∗
2
2
C_3^2*8*2^2
C32∗8∗22
有三位包含6或8:
2
3
2^3
23,每一位2种选择
所以一共
C
3
1
∗
8
2
∗
2
+
C
3
2
∗
8
∗
2
2
+
2
3
=
488
C_3^1*8^2*2+C_3^2*8*2^2+2^3=488
C31∗82∗2+C32∗8∗22+23=488
验证:
int x = 0;
for (int i = 1; i <= 1000; i++) {
if (String.valueOf(i).contains("8") || String.valueOf(i).contains("6")) {
x++;
}
}
System.out.println(x); // 488
上面的8和8或6可以推广到其他任意数字。
继续举一反三:
1到10000中包含6或8但不包含4的数字的个数
这个从对立面不好分析,那我们直接正面分析
包含一个6或8:
C
4
1
∗
7
3
∗
2
C_4^1*7^3*2
C41∗73∗2
包含两个6或8:
C
4
2
∗
7
2
∗
2
2
C_4^2*7^2*2^2
C42∗72∗22
包含三个6或8:
C
4
3
∗
7
∗
2
3
C_4^3*7*2^3
C43∗7∗23
包含四个6或8:
2
4
2^4
24
所以一共4160种情况
验证:
int count = 0;
for (int i = 1; i <= 10000; i++) {
if (!String.valueOf(i).contains("4") && (String.valueOf(i).contains("8") || String.valueOf(i).contains("6"))) {
count++;
}
}
System.out.println(count); // 4160