蓝桥杯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;
}
posted @ 2024-04-06 09:40  DawnTraveler  阅读(60)  评论(0编辑  收藏  举报