1. 纯偶数问题解析与进制转换实战
1.1 纯偶数问题定义与数学建模
纯偶数是指每一位数字都是偶数的非负整数(0,2,4,6,8)。题目要求我们找出按升序排列的第n个纯偶数。观察序列可以发现:
0, 2, 4, 6, 8, 20, 22, 24, 26, 28, 40, 42,...
这实际上是一个基于数字{0,2,4,6,8}的五进制系统。每个纯偶数可以看作是五进制数的数字乘以2的结果。例如:
- 第1个:0 → 0(五进制0)×2
- 第2个:2 → 1(五进制1)×2
- 第6个:20 → 10(五进制5)×2
1.2 进制转换算法实现
核心思路是将(n-1)转换为五进制,然后将每位数字乘以2:
cpp复制#include<bits/stdc++.h>
using namespace std;
long long s[10000];
int main(){
long long n;
cin >> n;
int cnt = 0;
// 特殊情况处理
if(n == 1){
cout << 0; // 第一个纯偶数是0
return 0;
}
n = n - 1; // 转换为0-based索引
// 十进制转五进制(逆序存储)
while(n){
s[++cnt] = n % 5;
n /= 5;
}
// 输出结果(每位乘以2)
for(int i = cnt; i >= 1; i--){
cout << s[i] * 2;
}
return 0;
}
1.3 进制转换的通用实现方法
1.3.1 十进制转任意进制
通用转换函数模板:
cpp复制vector<int> convertBase(int num, int base) {
vector<int> digits;
if(num == 0) digits.push_back(0);
while(num > 0) {
digits.push_back(num % base);
num /= base;
}
reverse(digits.begin(), digits.end());
return digits;
}
1.3.2 任意进制转十进制
反向转换实现:
cpp复制int toDecimal(const vector<int>& digits, int base) {
int num = 0;
for(int d : digits) {
num = num * base + d;
}
return num;
}
1.4 算法复杂度分析
- 时间复杂度:O(log₅n),因为每次循环n都除以5
- 空间复杂度:O(log₅n),用于存储五进制位
注意事项:当n很大时(比如1e18),需要使用long long类型避免溢出。数组大小应根据问题规模合理设置。
2. CSP子序列统计的DP解法
2.1 问题重述与暴力解法
给定一个由大写字母组成的字符串s,统计满足i<j<k且s[i]='
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容