蓝桥杯2023年A组-试题A-幸运数
0.题目
1.题解
1.1 暴力枚举
思路
这是一个填空题,所以可以直接暴力枚举
注意:
1.要是想要求位数: 使用 log10(abs(num)) + 1
2.%求余两边都必须是整数, pow(10, halfDigits);的返回值是double,这里必须转换
代码
#include <iostream>
#include <cmath>
bool isLuckyNumber(int num) {
int digits = (int)log10(abs(num)) + 1; // 计算数位
if (digits % 2 != 0) // 确保数位为偶数
return false;
int halfDigits = digits / 2;
int front = num / pow(10, halfDigits);
int back = num % (int)pow(10, halfDigits);
int sumFront = 0, sumBack = 0;
for (int i = 0; i < halfDigits; ++i) {
sumFront += front % 10;
sumBack += back % 10;
front /= 10;
back /= 10;
}
return sumFront == sumBack;
}
int main() {
int luckyCount = 0;
for (int i = 1; i <= 1e8; ++i) {
if (isLuckyNumber(i)) {
luckyCount++;
}
}
std::cout << luckyCount << std::endl;
return 0;
}
1.2 搜索
思路
使用DFS深度搜索,首先我们可以将该数切割成两部分,从半边位数、左半部分和,右半部分和作为三个参数,不断递归直至左半部分和右半部分都是四位
递归从0,0,0开始,嵌套循环表示0-9的数字,每次将位数加入计数,只要当 L!=0且 L==R的时候, 计数+1
注意前导0的问题,我们不允许类似025,013之类的数,所以设置'if (L == 0 && i == 0) continue;'避免前导0
代码
#include<bits/stdc++.h>
using namespace std;
int ans = 0;
void dfs(int x, int L, int R) {
if(L != 0 && L==R)
ans++;
if(x == 4) return;
for(int i = 0; i <= 9; i++){
if (L == 0 && i == 0) continue; //避免前导0
for(int j = 0; j <= 9; j++)
dfs(x+1, L+i, R+j);
}
}
int main() {
dfs(0,0,0);
cout << ans << endl;
}