藍橋杯2023年A組-試題A-幸運數

DawnTraveler發表於2024-04-06

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;
}

相關文章