枚举算法是最朴素的算法之一。
枚举算法也称之为穷举算法,就是按照问题本身的性质,一一列举出该问题所有可能的解,并在列举的过程中,逐一检验每个可能解是否是问题的真正解。若是则采纳这个解;否则抛弃它。
其中很重要的两点是不重、不漏,注意枚举算法是计算机可求解问题的本质方法,其特点为全面且实现简单,效率则相对较低,效率提升空间大。
例题
设\(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) { 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; } int target = (n - l) / base + lnum; 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]; }
|