[第一周-T3] 天使数
题目描述
定义一个数是“天使数”,当且仅当下面三个性质被满足:
Rain:不存在相邻的两个相同数位;
Angle:数至少为两位数,且第一位和最后一位均为 9 9 9;
Kawaii:每个数码均出现过偶数次。
给定 n n n 个数,删除其中的所有天使数并报告剩余的数的数量。
例: 912129 912129 912129 是天使数,而 9119 9119 9119 则不是,因为它不满足第一个性质。
输入格式
第一行一个正整数 n n n,下一行 n n n 个正整数。
输出格式
一行一个整数,表示剩余的数的数量。
样例 #1
样例输入 #1
5
99 912129 192921 123 9239
样例输出 #1
4
提示
【数据范围】
分值 | n n n | 特殊性质 |
---|---|---|
10 | ≤ 1 \le 1 ≤1 | 无 |
10 | ≤ 1 0 5 \le 10^5 ≤105 | A |
40 | ≤ 1 0 5 \le 10^5 ≤105 | B |
40 | ≤ 1 0 5 \le 10^5 ≤105 | 无 |
特殊性质 A:所有数位数均为奇数;
特殊性质 B:所有数均为六位数。
对于所有数据满足: 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105,每个数的大小在 1 1 1 和 1 0 9 10^9 109 之间。
思路
总之题目只需要判断三种情况,命名为“天使数“ 所以只需要一个布尔函数判断是否满足这些条件。代码用了反逻辑,如果满足了,布尔函数返回false,相同,在驻韩束里如果不满足布尔函数,那就证明满足了至少一个天使数字的条件。
isAngelNumber
- 先把数字转换成字符串,方便判断
- 第一个性质,判断相邻数
- 第二个性质,至少为两位数+第一个数/最后一个数为9
- 第三个性质,每个数出现过偶数次
#include <iostream>
#include <vector>
using namespace std;
bool isAngelNumber(int num) {
string str_num = to_string(num);//强制把数字转换成字符串
int n = str_num.length();
// 检查第一个性质
for (int i = 1; i <= n; i++) {
if (str_num[i] == str_num[i - 1]) {
return false;
}
}
// 检查第二个性质
if (n < 2 || str_num[0] != '9' || str_num[n - 1] != '9') {
return false;
}
// 检查第三个性质
int digit_count[10] = {0};
for (int i = 0; i < str_num.length(); ++i) {
char digit = str_num[i];
digit_count[digit - '0']++;
}
for (int i = 0; i < 10; ++i) {
if (digit_count[i] % 2 != 0) {
return false;
}
}
//不满足
return true;
}
int main() {
int n,count=0;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; ++i) {
cin >> numbers[i];
}
for (int i=0;i<n;i++) {
if (!isAngelNumber(numbers[i])) {//满足
count++;
}
}
cout << count;
return 0;
}