给定一个整数n 范围是1到1e12,从1到n中满足只有2,6,8,9四个数且每个数最少出现一次的数的个数是,用c++代码和容斥定理实现,不需要思路
时间: 2024-05-01 11:16:25 浏览: 104
```c++
#include <iostream>
using namespace std;
long long calc(long long x) {
long long res = 0;
for (int i = 1; i < (1 << 4); ++i) {
int cnt = 0, mul = 1;
for (int j = 0; j < 4; ++j) {
if ((1 << j) & i) {
cnt++;
mul *= (j == 0 ? 2 : (j == 1 ? 6 : (j == 2 ? 8 : 9)));
}
}
res += (cnt & 1) ? x / mul : -(x / mul);
}
return res;
}
int main() {
long long n;
cin >> n;
cout << calc(n) << endl;
return 0;
}
```
相关问题
给定一个整数n 范围是1到1e12,从1到n中满足只有2,6,8,9四个数且每个数最少出现一次,的数的个数是,用c++代码实现
这道题可以使用容斥原理来解决。首先,我们可以计算出只包含2的数的个数、只包含6的数的个数、只包含8的数的个数、只包含9的数的个数,分别记为cnt2、cnt6、cnt8、cnt9。然后,我们可以计算出只包含2和6的数的个数、只包含2和8的数的个数、只包含2和9的数的个数、只包含6和8的数的个数、只包含6和9的数的个数、只包含8和9的数的个数,分别记为cnt26、cnt28、cnt29、cnt68、cnt69、cnt89。接着,我们可以计算出只包含2、6和8的数的个数、只包含2、6和9的数的个数、只包含2、8和9的数的个数、只包含6、8和9的数的个数,分别记为cnt268、cnt269、cnt289、cnt689。最后,我们可以计算出只包含2、6、8和9的数的个数,记为cnt2689。最后的答案就是:
cnt2 + cnt6 + cnt8 + cnt9 - cnt26 - cnt28 - cnt29 - cnt68 - cnt69 - cnt89 + cnt268 + cnt269 + cnt289 + cnt689 - cnt2689
代码如下:
给定一个整数n 范围是1到1e12,从1到n中满足只有2,6,8,9四个数且每个数最少出现一次的数的个数是,用c++代码实现,不需要思路
```c++
#include <iostream>
#include <cstring>
using namespace std;
bool check(long long x) {
bool num[10];
memset(num, false, sizeof(num)); // 初始化num数组
while (x) {
num[x % 10] = true; // 标记数字出现
x /= 10;
}
return num[2] && num[6] && num[8] && num[9]; // 判断是否符合条件
}
int main() {
long long n;
cin >> n;
int cnt = 0;
for (long long i = 1; i <= n; i++) {
if (check(i)) {
cnt++;
}
}
cout << cnt << endl;
return 0;
}
```
阅读全文