满足以下条件的正整数:8、2、6、9中的每个数字至少在这个整数中出现一次,而且没有除了这四个之外的其他数字。问1和N(含N)之间有多少个满足这一条件的整数。输入一个整数N。输出符合条件的个数。C++最快代码实现
时间: 2024-06-04 18:13:49 浏览: 86
这是一个比较简单的组合问题,我们可以枚举数字中包含的数字个数,然后计算出这些数字的排列组合数,最后累加即可。
具体来说,假设数字中包含 $k$ 个数字,那么这 $k$ 个数字可以任意排列,而且每个数字可以在数字中出现 $1$ 次或 $2$ 次,因此有 $k!/(a_1!a_2!\cdots a_k!)$ 种排列方式,其中 $a_i$ 表示数字 $i$ 出现的次数。对于每个 $a_i$,如果 $a_i=1$,那么对答案的贡献为 $1$,如果 $a_i=2$,那么对答案的贡献为 $2$。因此,我们可以枚举数字中包含的数字个数,然后对每个数字计算贡献,最后累加即可。
代码实现如下:
相关问题
满足以下条件的正整数:8、2、6、9中的每个数字至少在这个整数中出现一次,而且没有除了这四个之外的其他数字。问1和N(含N)之间有多少个满足这一条件的整数。输入一个整数N。输出符合条件的个数。C++代码实现
```
#include <stdio.h>
// 判断一个四位数是否符合条件
int check(int n) {
int digit[10] = {0}; // 记录每个数字是否出现过
while (n > 0) {
digit[n % 10] = 1;
n /= 10;
}
return digit[2] && digit[6] && digit[8] && digit[9];
}
int main() {
int n, count = 0;
scanf("%d", &n);
for (int i = 1000; i <= n; i++) {
if (check(i)) {
count++;
}
}
printf("%d\n", count);
return 0;
}
```
说明:题目要求每个数字至少出现一次,因此考虑枚举所有的四位数,判断其中是否包含2、6、8、9四个数字即可。
运行最快满足以下条件的正整数:8、2、6、9中的每个数字至少在这个整数中出现一次,而且没有除了这四个之外的其他数字。问1和N(含N)之间有多少个满足这一条件的整数。输入一个整数N。输出符合条件的个数。运行时间最短C++代码实现
#include <stdio.h>
int main()
{
int n, count = 0;
scanf("%d", &n);
for (int i = 2698; i <= n; i++)
{
int num[10] = {}, temp = i;
while (temp)
{
num[temp % 10]++;
temp /= 10;
}
if (num[2] && num[6] && num[8] && num[9])
count++;
}
printf("%d\n", count);
return 0;
}
阅读全文