抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

一方の笔记本

The only source of knowledge is experience.

枚举算法是最朴素的算法之一。

枚举算法也称之为穷举算法,就是按照问题本身的性质,一一列举出该问题所有可能的解,并在列举的过程中,逐一检验每个可能解是否是问题的真正解。若是则采纳这个解;否则抛弃它。

其中很重要的两点是不重、不漏,注意枚举算法是计算机可求解问题的本质方法,其特点为全面且实现简单,效率则相对较低,效率提升空间大。

例题

\(S\)为由所有正整数按从小到大的顺序组成的序列,即\(S=1234567891011 \dots\),记\(S\)中第一次出现\(1\)为位置\(1\),求S的第\(n\)位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int f(int n) {
//1、确定n所在的位数范围
int base = 1;//位数
int l = 1, step = 9, lnum = 1;
for (; base <= 8; base++) {
if (n >= l && n <= l + step - 1) {
break;
}
else {
l += step;
step *= (10 * (base + 1));
step /= base;
lnum *= 10;
}
}
if (base > 9) {
return -1;
}
//2、计算在哪个数
int target = (n - l) / base + lnum;
//3、计算在这个数的第几位
int targetIndex = (n - l + 1) % base;
targetIndex = (!targetIndex ? base : targetIndex);
vector<int> v;
while (target){
v.push_back(target % 10);
target /= 10;
}
return v[v.size() - targetIndex];
}

评论