系列:1到1000中包含8的个数

排列组合问题

分析:
不包含8的数的每一位都不是8,所以1到999每个数的每位都只能由0~7和9构成,总共有 9 3 9^3 93种组合。所以包含8的数字的个数为 1000 − 9 3 = 271 1000-9^3=271 100093=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 C3192种情况
包含2个8的:首先从3位中挑出两位包含8,剩下的一位不包含8,共 C 3 2 ∗ 9 C_3^2*9 C329种情况
包含3个8的只有一种情况。
所以一共 C 3 1 ∗ 9 2 + C 3 2 ∗ 9 + 1 = 271 C_3^1*9^2+C_3^2*9+1=271 C3192+C329+1=271

举一反三:
1到1000中包含6或8的数字

对立面分析:即不包含6也不包含8的情况一共 8 3 8^3 83种,所以包含6或者8的情况有 1000 − 8 3 = 488 1000-8^3=488 100083=488

正面分析:
有一位包含6或8: C 3 1 ∗ 8 2 ∗ 2 C_3^1*8^2*2 C31822,从3位中挑出一位放6或8,剩下两位都不能用6或8,乘以2是因为放6或者放8.
有两位包含6或8: C 3 2 ∗ 8 ∗ 2 2 C_3^2*8*2^2 C32822
有三位包含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 C31822+C32822+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 C41732
包含两个6或8: C 4 2 ∗ 7 2 ∗ 2 2 C_4^2*7^2*2^2 C427222
包含三个6或8: C 4 3 ∗ 7 ∗ 2 3 C_4^3*7*2^3 C43723
包含四个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
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值