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