题目:
lulu喜欢小于等于1000的正整数,但是如果某个数是a或b的倍数,lulu会讨厌这个数。如果某个数里包含了a和b两个数里包含的数,lulu也会讨厌。(例如a=14,b=23,如果数字中包含1、2、3、4这四个数中的任意一个数,lulu就会讨厌这个数)。现在告诉你a,b,你能说出lulu喜欢的数有多少个么。
Input:
第一行是样例数T
第2到2+T-1行每行有2个整数a b。
Output:
输出lulu喜欢的数的个数
Sample Input:
3
2 3
14 23
1234 5678
Sample Output:
171
190
7
题目链接
思路:把输入两个数的每一位数拆分标记,对范围内所有数字打表
AC代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
bool Judge[10] = {0}; // 用Judge判断输入的两个数中包含那些数
int d[5] = {10,100,1000,10000,100000}; // 利用d数组取出每位数
bool IsLike[1010]; // 对不喜欢的数打表
int a,b; // 输入的两个数
void _Judge(int x,int y) { // _Judge函数判断输入的两个数中包含哪些数
mem(Judge, 0); // 初始化判断包含元素的数组
for (int i = 0;i < 5;++i) { // 循环提取每位数
int a1 = a,b1 = b; // 利用中间变量a1,b1提取
if (a >= d[i]) {
a1 /= d[i];
}
if (b > d[i]) {
b1 /= d[i];
}
a1 %= 10;
b1 %= 10;
Judge[a1] = 1; // 将提取出来的数标记
Judge[b1] = 1;
}
}
void Like() { // Like函数对IsLike数组打表
mem(IsLike, 0); // 初始化打表数组
for (int i = 0;i < 1010;++i) { // 遍历打表
if (i % a == 0 || i % b == 0) { // 判断整除条件
IsLike[i] = 1; // 如果可以整除则打表继续循环下个数
continue;
}
for (int j = 0;j < 3;++j) { // 循环判断是否含有输入数中的数
int judgeLike = i;
if (i >= d[j]) {
judgeLike /= d[j];
}
judgeLike %= 10;
if (Judge[judgeLike] == 1) { // 如果含有则打表继续循环下个数
IsLike[i] = 1;
break;
}
}
}
}
int main() {
// 加速输入输出
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T; // 输入测试组数
while (T--) {
cin >> a >> b;
_Judge(a,b); // 提取每位数
Like(); // 打表
ll sum = 0;
for (int i = 1;i <= 1000;++i) { // 循环统计表中未被标记过的喜欢数
if (IsLike[i] == 0) {
sum++;
}
}
cout << sum << endl; // 输出
}
return 0;
}